¿cuál es la diferencia entre alloc y allocWithZone:?


From forum discussion, seem like that the big difference is performance factor, allocWithZone: will alloc memory from particular memory area, which reduce cost of swapping.

En la práctica , casi no hay oportunidad de usar allocWithZone:, cualquiera puede dar un ejemplo simple para ilustrar qué caso usar allocWithZone: ?

Gracias,

Author: Forrest, 2010-12-23

6 answers

Cuando un objeto crea otro, es a veces una buena idea para asegurarse ambos están asignados desde el mismo región de la memoria. El método de la zona (declarado en el protocolo NSObject) puede ser utilizado para este propósito; devuelve la zona donde se encuentra el receptor encontrar.

Esto me sugiere que sus ivars, y cualquier objeto que sus clases "creen" ellos mismos podrían hacer uso de +allocWithZone: de esta manera, para hacer que las instancias que crean en la misma zona.

-(id)init {
  if (self = [super init]) {
    someIvar = [[SomeOtherClass allocWithZone:[self zone]] init];
  }

  return self;
}
 47
Author: d11wtq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-11 20:21:40

De la documentación de Apple :

Este método existe por razones históricas; las zonas de memoria ya no son utilizado por Objective-C.

 29
Author: Rivera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-11 07:40:26

Un buen ejemplo para usar allocWithZone: es cuando está implementando el protocolo NSCopy, que le permite hacer que sus objetos personalizados sean copiables (copia profunda / copia por valor) como:

(1) ClassName *newObject = [currentObject copy]; //results in newObject being a copy of currentObject not just a reference to it

El protocolo NSCopy garantiza la implementación de un método:

(2) -(id)copyWithZone:(NSZone *)zone;

Al copiar un objeto, el mensaje 'copiar' que envía como se indica anteriormente (1) cuando se indica como 'copyWithZone envía un mensaje al método(2). aka no tienes que hacer nada para conseguir una zona tú mismo.

Ahora como usted tiene una' zona ' enviada a este mensaje se puede utilizar para asegurarse de que una copia se realiza desde la memoria en la misma región que el original.

Esto se puede usar como:

-(id)copyWithZone:(NSZone *)zone
{
   newCopy = [[[self class]allocWithZone:zone]init]; //gets the class of this object then allocates a new object close to this one and initialises it before returning
   return(newCopy);
}

Este es el único lugar donde soy consciente de que allocWithZone se usa realmente.

 5
Author: Richard Washington,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-07 00:35:07

Utilizo allocWithZone en singleton. Como Forrest mencionó, las variables creadas se asignaron desde la misma región de memoria. Por lo tanto, otras clases pueden usarlas o acceder a ellas desde la misma zona de memoria. Ahorre espacio de memoria cuando ejecute su aplicación.

 2
Author: felixwcf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-05 16:12:20

En la Referencia de Funciones de la Fundación , todas las funciones de Zone ahora están precedidas por la advertencia de que las Zonas serán ignoradas.

Las zonas se ignoran en iOS y en tiempo de ejecución de 64 bits en OS X. No debe usar zonas en el desarrollo actual.

NSCreateZone
NSRecycleZone
NSSetZoneName
NSZoneCalloc
NSZoneFree
NSZoneFromPointer
NSZoneMalloc
NSZoneName
NSZoneRealloc
NSDefaultMallocZone
 2
Author: pkamb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-27 20:53:42

Incluso si la documentación de Apple indica que allocWithZone:

Existe por razones históricas; las zonas de memoria ya no son utilizadas por Objective-C. No debe sobrescribir este método.

Y

Las zonas se ignoran en iOS y en tiempo de ejecución de 64 bits en OS X. No debe usar zonas en el desarrollo actual.

En realidad lo anulé en una clase Objective-C (en un proyecto Objective-C completo) y el método se llama cuando lo hago [[Mylass alloc] init] incluso si la compilación se ejecuta en un iPhone 6s.

Pero creo que es mejor seguir la documentación y anular el método alloc en lugar de éste porque alloc ciertamente puede hacer el mismo trabajo.

 0
Author: Thibault,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-29 22:20:55