Warum behält eine Variable mit dem Qualifikationsmerkmal __weak ein Objekt bei?

Hier ist mein Code:

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;
}

Und Konsolenausgabe:

    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

NSArray wurde in NSMutableArray geändert und die Variable tmp wurde zu Null.

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;
}

Kann mir jemand erklären, warum das so ist?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage