这是说明问题的代码片段
__weak id ptr = nil;
__weak id ptr2 = nil;
@autoreleasepool {
void (^block)(void) = [^{
NSLog(@"hahaha");
} copy];
block();
[[(id)block rac_willDeallocSignal] subscribeCompleted:^{
NSLog(@"block will dealloc");
}];
ptr = block;
int blockRetainCount = CFGetRetainCount((__bridge CFTypeRef)block);
NSObject *obj = [[NSObject alloc] init];
[obj.rac_willDeallocSignal subscribeCompleted:^{
NSLog(@"Obj dealloc");
}];
ptr2 = obj;
int objRetainCount = CFGetRetainCount((__bridge CFTypeRef)obj);
NSLog(@"oK");
}
NSLog(@"after pool %@ %@" , ptr, ptr2);
当我运行此代码片段时,我会看到
Obj dealloc
打印到控制台,但没有block will dealloc
。在自动释放池之后,我还将看到ptr
仍包含对该块的有效引用,而ptr2
已正确地重置为预期的nil。为什么会有这种差异?什么时候块会全部取消分配?
最佳答案
应该说服您不要尝试这种事情的多个问题:
第一,在存在ARC的情况下,不能保证CFGetRetainCount返回任何有意义的东西。
第二,不能保证一个块完全使用保留计数。没有捕获任何变量的块被分配为静态变量;复制,保留等等对它们什么也不做,并且永远不会分配或释放它们。
第三,不能保证任何块在释放后都将调用dealloc。并且不能保证它将在下一个OS或iOS版本中发生。
关于ios - 为什么阻止对象不能像NSObject一样释放内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25532433/