objective c - ¿Cuál es la diferencia entre alloc y allocWithZone:?
objective-c memory-management (6)
Cuando un objeto crea otro, a veces es una buena idea asegurarse de que ambos estén asignados desde la misma región de memoria. El método de zona (declarado en el protocolo NSObject) se puede usar para este propósito; devuelve la zona donde se encuentra el receptor.
Esto me sugiere que sus ivars, y cualquier objeto que sus clases "creen" ellos mismos, podrían usar +allocWithZone:
de esta manera, para crear instancias que creen en la misma zona.
-(id)init {
if (self = [super init]) {
someIvar = [[SomeOtherClass allocWithZone:[self zone]] init];
}
return self;
}
Desde la discusión del foro , parece que la gran diferencia es el factor de rendimiento, allocWithZone: asignará memoria desde un área de memoria particular, lo que reducirá el costo del intercambio.
En la práctica, casi no se tiene oportunidad de usar allocWithZone: cualquiera puede dar un ejemplo simple para ilustrar qué caso usar allocWithZone:?
Gracias,
De la documentation de Apple:
Este método existe por razones históricas; las zonas de memoria ya no son utilizadas por Objective-C.
En la referencia de funciones de la base , todas las funciones de la Zone
están ahora precedidas por la advertencia a continuación de que se ignorarán las zonas.
Las zonas se ignoran en iOS y el 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
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 debes anular este método.
y
Las zonas se ignoran en iOS y el tiempo de ejecución de 64 bits en OS X. No debe usar zonas en el desarrollo actual.
en realidad, lo sobreescribo en una clase Objective-C (en un proyecto completo de Objective-C) y se llama al método cuando 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
lugar de este porque alloc ciertamente puede hacer el mismo trabajo.
Un buen ejemplo para usar allocWithZone: es cuando está implementando el protocolo NSCopy, que le permite hacer que sus objetos personalizados se puedan copiar (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 que implemente un método:
(2) -(id)copyWithZone:(NSZone *)zone;
Al copiar un objeto, el mensaje de "copia" que envía como se indica arriba (1) cuando se indica como "copyWithZone" envía un mensaje al método (2). aka no tienes que hacer nada para obtener una zona tú mismo.
Ahora que tiene una ''zona'' enviada a este mensaje, puede usarla para asegurarse de que se haga una copia de 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 sé que se usa allocWithZone.
Yo uso allocWithZone
en singleton. Como mencionó Forrest, las variables creadas se asignaron desde la misma región de memoria. Por lo tanto, otras clases pueden usar o acceder a ellos desde la misma zona de memoria. Ahorre espacio en la memoria cuando ejecuta su aplicación.