NSHashTable 保留弱引用
NSHashTable retaining weak reference
因此,Apple 的 [NSHashTable weakObjectsHashTable]
文档指出:
Returns a new hash table for storing weak references to its contents.
所以,当我运行下面的代码...
NSHashTable *hashTable = [NSHashTable weakObjectsHashTable];
ABC *object = [[ABC alloc] init];
[hashTable addObject:object];
NSLog(@"%@", [hashTable anyObject]);
object = nil;
NSLog(@"%@", [hashTable anyObject]);
输出为:
2017-09-18 12:57:02.801 Test2[6912:640614] <ABC: 0x608000014eb0>
2017-09-18 12:57:02.801 Test2[6912:640614] <ABC: 0x608000014eb0>
2017-09-18 12:57:02.803 Test2[6912:640614] dealloc // (dealloc of ABC)
看起来调用 NSLog(@"%@", [hashTable anyObject]);
是在保留对象。
如果我打电话,
NSHashTable *hashTable = [NSHashTable weakObjectsHashTable];
ABC *object = [[ABC alloc] init];
[hashTable addObject:object];
//NSLog(@"%@", [hashTable anyObject]);
object = nil;
NSLog(@"%@", [hashTable anyObject]);
输出符合预期:
2017-09-18 13:00:23.949 Test2[6936:645459] dealloc
2017-09-18 13:00:23.949 Test2[6936:645459] (null)
谁能告诉我我的误会在哪里?
您甚至不必调用 NSLog — 只需执行 [hashTable anyObject] 就足以使对象保持不变。原因似乎是 anyObject returns 一个自动释放的引用,直到将来某个时间点才会得到 release:d。将整个东西包装在一个@autorelease 块中,我相信它会按预期工作。
一般来说,对 ARC:ed 对象的确切发布时间做出假设是危险的,因为有很多这样的魔法在发生。
因此,Apple 的 [NSHashTable weakObjectsHashTable]
文档指出:
Returns a new hash table for storing weak references to its contents.
所以,当我运行下面的代码...
NSHashTable *hashTable = [NSHashTable weakObjectsHashTable];
ABC *object = [[ABC alloc] init];
[hashTable addObject:object];
NSLog(@"%@", [hashTable anyObject]);
object = nil;
NSLog(@"%@", [hashTable anyObject]);
输出为:
2017-09-18 12:57:02.801 Test2[6912:640614] <ABC: 0x608000014eb0>
2017-09-18 12:57:02.801 Test2[6912:640614] <ABC: 0x608000014eb0>
2017-09-18 12:57:02.803 Test2[6912:640614] dealloc // (dealloc of ABC)
看起来调用 NSLog(@"%@", [hashTable anyObject]);
是在保留对象。
如果我打电话,
NSHashTable *hashTable = [NSHashTable weakObjectsHashTable];
ABC *object = [[ABC alloc] init];
[hashTable addObject:object];
//NSLog(@"%@", [hashTable anyObject]);
object = nil;
NSLog(@"%@", [hashTable anyObject]);
输出符合预期:
2017-09-18 13:00:23.949 Test2[6936:645459] dealloc
2017-09-18 13:00:23.949 Test2[6936:645459] (null)
谁能告诉我我的误会在哪里?
您甚至不必调用 NSLog — 只需执行 [hashTable anyObject] 就足以使对象保持不变。原因似乎是 anyObject returns 一个自动释放的引用,直到将来某个时间点才会得到 release:d。将整个东西包装在一个@autorelease 块中,我相信它会按预期工作。
一般来说,对 ARC:ed 对象的确切发布时间做出假设是危险的,因为有很多这样的魔法在发生。