我有一个很弱的NSPointerArray与一些已经被释放的NSObject.在打电话之前,我看到的是:
(lldb) po [currentArray count] 1 (lldb) po [currentArray pointerAtIndex:0] <nil> (lldb) po [currentArray allObjects] <__NSArrayM 0x16f04f00>( )@H_502_4@这是有道理的,但真正奇怪的是,当我在该数组上调用compact时,我看到相同的值! Count仍然返回1,而pointerAtIndex:0为零. @H_502_4@为什么没有被删除? @H_502_4@编辑 @H_502_4@这是完整的代码(是的,它是XCTesting框架):
- (void)testCompaction { __weak id testingPointer = nil; NSPointerArray *weakArray = [NSPointerArray weakObjectsPointerArray]; @autoreleasepool { NSObject *someObj = [[NSObject alloc] init]; testingPointer = someObj; [weakArray addPointer:(__bridge void*)testingPointer]; NSLog(@"before compaction inside autorelease: testingPointer = %@ count = %d,allObjects = %@,pointerAtIndex:0 = %@,pointerAtIndex:0 class = %@",testingPointer,[weakArray count],[weakArray allObjects],[weakArray pointerAtIndex:0],[(id)[weakArray pointerAtIndex:0] class]); someObj = nil; } NSLog(@"before compaction outside autorelease: testingPointer = %@ count = %d,[(id)[weakArray pointerAtIndex:0] class]); [weakArray compact]; NSLog(@"after compaction outside autorelease: testingPointer = %@ count = %d,[(id)[weakArray pointerAtIndex:0] class]); }@H_502_4@和日志:
before compaction inside autorelease: testingPointer = <NSObject: 0x7de7ff80> count = 1,allObjects = ( "<NSObject: 0x7de7ff80>" ),pointerAtIndex:0 = <NSObject: 0x7de7ff80>,pointerAtIndex:0 class = NSObject 2015-07-20 14:27:14.062 AppetizeSuite copy[54144:9019054] before compaction outside autorelease: testingPointer = (null) count = 1,allObjects = ( ),pointerAtIndex:0 = (null),pointerAtIndex:0 class = (null) 2015-07-20 14:27:22.615 AppetizeSuite copy[54144:9019054] after compaction outside autorelease: testingPointer = (null) count = 1,pointerAtIndex:0 class = (null)@H_502_4@为什么compact方法不删除第一个指针?在打电话前显然是零.