当启用时ARC,以下代码使得物镜对于保留两次块通过调用objc_retain()和objc_retainBlock().(因此retainCount块定义后变成3).
我检查了obj不在自动释放池中,并且在方法结束时有两个objc_release()调用obj.(我知道计数保留没有意义,但我正在检查objc_retain()调用,而不是几乎没有检查保留计数.)这背后的基本原理是什么?
-(void)myMethod { NSObject *obj = [[NSObject alloc] init]; NSLog(@"obj %@ retaincount %ld", obj, CFGetRetainCount((__bridge CFTypeRef)obj)); void (^myBlock)(void) = ^() { NSLog(@"obj %@ retaincount %ld", obj, CFGetRetainCount((__bridge CFTypeRef)obj)); }; NSLog(@"obj %@ retaincount %ld", obj, CFGetRetainCount((__bridge CFTypeRef)obj)); myBlock(); }
仅仅保留obj一次以便通过块捕获它是不够的?
注意:此外,当我删除myBlock变量并调用它时,所以只使用^(){...}定义并且永远不会调用该定义,obj仍然保留objc_retain(),这看起来很奇怪.我正在使用XCode 4.3.2.