¿Por qué la variable con calificador débil retiene un object?

Aquí está mi código:

extern void _objc_autoreleasePoolPrint(); int main(int argc, const char * argv[]) { NSArray __weak *tmp = nil; @autoreleasepool { NSArray __strong *obj = [[NSArray alloc] init]; NSLog(@"obj &: %p", obj); tmp = obj; NSLog(@"tmp &: %p", tmp); _objc_autoreleasePoolPrint(); } NSLog(@"tmp: %@", tmp); // why not (null) ? return 0; } 

Y salida de console:

  2013-05-01 22:14:32.966 SimpleConsoleObjectiveCApplicationWithARC[40660:f07] obj &: 0x7fedf9403110 2013-05-01 22:14:32.969 SimpleConsoleObjectiveCApplicationWithARC[40660:f07] tmp &: 0x7fedf9403110 objc[40660]: ############## objc[40660]: AUTORELEASE POOLS for thread 0x7fff751af180 objc[40660]: 2 releases pending. objc[40660]: [0x7fedf9805000] ................ PAGE (hot) (cold) objc[40660]: [0x7fedf9805038] ################ POOL 0x7fedf9805038 objc[40660]: [0x7fedf9805040] 0x7fedf9403110 __NSArrayI objc[40660]: ############## 2013-05-01 22:14:32.971 SimpleConsoleObjectiveCApplicationWithARC[40660:f07] tmp: ( ) 

PS # 1

Se cambió NSArray a NSMutableArray y la variable tmp se convirtió en nil.

 extern void _objc_autoreleasePoolPrint(); int main(int argc, const char * argv[]) { NSMutableArray __weak *tmp = nil; @autoreleasepool { NSMutableArray __strong *obj = [[NSMutableArray alloc] init]; NSLog(@"obj &: %p", obj); tmp = obj; NSLog(@"tmp &: %p", tmp); _objc_autoreleasePoolPrint(); } NSLog(@"tmp: %@", tmp); return 0; } 

¿Alguien me puede explicar por qué funciona de esta manera?

Parece que [[NSArray alloc] init] devuelve una "instancia compartida" de un NSArray vacío:

 NSArray *a = [[NSArray alloc] init]; NSArray *b = [[NSArray alloc] init]; NSLog(@"a &: %p", a); NSLog(@"b &: %p", b); 

Salida:

     a &: 0x100103110
     b &: 0x100103110

Esta "instancia compartida" continúa existiendo incluso si su obj fuerte de reference se ha ido, por lo tanto, el puntero débil no se establece en nil .

Obviamente, [[NSMutableArray alloc] init] no puede devolver una instancia compartida.

    Intereting Posts