iOS下的NSHashTable在使用option为NSHashTableWeakMemory时,当添加到NSHashTable内部的对象的引用计数为零时,NSHashTable会自动将此对象从其内部移除。
测试如下代码时需要将 ARC关闭,开启MRC
Person *xiaoming = [Personnew];
xiaoming.name =@"xiaoming tongxie";
NSValue *value = [NSValuevalueWithNonretainedObject:xiaoming];
NSMutableArray *mutArray = [NSMutableArrayarray];
[mutArray addObject:value];
[xiaoming release];
value = [mutArray objectAtIndex:0];
xiaoming = [value nonretainedObjectValue];
NSLog(@"the Person name is %@", xiaoming.name);
// NSLog(@"the xiaoming retain count is %lu", (unsigned long)[xiaoming retainCount]);
NSLog(@"mutArray is %@, count is %lu", mutArray, (unsignedlong)mutArray.count);
NSAutoreleasePool *pool = [NSAutoreleasePoolnew];
Person *xiaoming = [Personnew];
xiaoming.name =@"xiaoming tongxie";
NSHashTable *hashTable = [NSHashTablehashTableWithOptions:NSHashTableWeakMemory];
[hashTable addObject:xiaoming];
NSLog(@"the xiaoming retain count is %lu", (unsignedlong)[xiaomingretainCount]);
[xiaoming release];
// [pool drain];
// NSLog(@"the xiaoming retain count is %lu", (unsigned long)[xiaoming retainCount]);
NSLog(@"the hashTable count is %lu", (unsignedlong)hashTable.count);
NSLog(@"the hashTable count is %lu", (unsignedlong)hashTable.count);