NSPointerFunctionsCopyIn confusion

Traté de agregar un NSDate objetar a mi NSPointerArray configurado con (NSPointerFunctionsCopyIn) opción:

NSDate *today= [NSDate date];

NSPointerArray *p_arr = [NSPointerArray pointerArrayWithOptions:NSPointerFunctionsCopyIn];

[p_arr addPointer:(void *)today];

 // comparing addresses;

 NSLog(@" Addresses are: %p  , %p " , today , [p_arr pointerAtIndex:0]);

//Addresses are:0x1004005d0  , 0x1004005d0

pero como sé con "NSPointerFunctionsCopyIn", el objeto en mi matriz de punteros debe ser una copia nueva, no un objeto compartido.

preguntado el 03 de diciembre de 13 a las 11:12

1 Respuestas

Como se explica en Preguntas y respuestas del viernes 2010-05-28: clases de colección de leopardo, el NSPointerFunctionsCopyIn opciones hace que los punteros de objeto se "copien" usando el NSCopying protocolo. Esto no significa necesariamente que se crea un nuevo objeto.

En el caso de los inmutable objetos (comoNSDate), NSCopying pueden implementarse conservando el original en lugar de crear una nueva copia. Y esto es lo que sucede en tu caso:

NSDate *today = [NSDate date];
NSDate *today2 = [today copy];

NSLog(@"%p %p", today, today2);
// Output: 0x1001040f0 0x1001040f0

Respondido el 03 de diciembre de 13 a las 11:12

en ese caso, ¿cuál es la diferencia entre "NSPointerFunctionsStrongMemory" y "NSPointerFunctionsCopyIn" porque ambos conservarán el nuevo objeto agregado? - encenderse

Según tengo entendido, esas opciones son independientes entre sí. "NSPointerFunctionsStrongMemory" es una "opción de memoria" y significa (en relación con el valor predeterminado "NSPointerFunctionsObjectPersonality") que el objeto se conserva. Causas de "NSPointerFunctionsCopyIn" copyWithZone para ser llamado en el objeto. copyWithZone podría devolver un nuevo objeto o simplemente retener el objeto pasado (consulte la documentación del protocolo NSCoping). Si prueba su código con un NSMutableString, obtendrá un objeto diferente. - Martin R

@user3061088: ¿Qué es exactamente lo que te preocupa? Un objeto NSDate no se puede mutar, por lo que no debería importar si obtiene un puntero al objeto original o un puntero a un nuevo objeto. - Martin R

Entendí el punto, si agrego un objeto mutable, creará un nuevo objeto, pero si agrego uno inmutable, conservará el anterior, gracias amigo. encenderse

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.