【发布时间】:2014-08-27 16:29:41
【问题描述】:
这是一个说明问题的代码sn-p
__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);
当我运行这个 sn-p 时,我会看到 Obj dealloc 打印到控制台,但不是 block will dealloc。在自动释放池之后,我还将看到 ptr 仍然包含对块的有效引用,而 ptr2 已按预期正确重置为 nil。为什么会有这种差异?块什么时候被解除分配?
【问题讨论】:
标签: ios objective-c memory-management objective-c-blocks