我有一个很弱的NSPointerArray与一些已经被释放的NSObject.在打电话之前,我看到的是:
- (lldb) po [currentArray count]
- 1
- (lldb) po [currentArray pointerAtIndex:0]
- <nil>
- (lldb) po [currentArray allObjects]
- <__NSArrayM 0x16f04f00>(
- )
这是有道理的,但真正奇怪的是,当我在该数组上调用compact时,我看到相同的值! Count仍然返回1,而pointerAtIndex:0为零.
为什么没有被删除?
编辑
这是完整的代码(是的,它是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]);
- }
和日志:
- 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)