loc*_*ope 1 memory-management objective-c retain retaincount objective-c-blocks
当启用时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();
}
Run Code Online (Sandbox Code Playgroud)
仅仅保留obj一次以便通过块捕获它是不够的?
注意:此外,当我删除myBlock变量并调用它时,所以只使用^(){...}定义并且永远不会调用该定义,obj仍然保留objc_retain(),这看起来很奇怪.我正在使用XCode 4.3.2.
bbu*_*bum 13
www.whentouseretaincount.com - 即不要使用,retainCount因为它只会引起混乱.即使是学习内脏.
如果您想知道块如何以及何时保留对象,您应该查看编译器,运行时和阻塞运行时源.一切都有.
块可以保留也可以不保留对象.具体地,块可以仅在复制块时保留对象(只要对象引用不是__weak).
类似地,但正交地,ARC的保留/释放行为基于编译器的优化级别而改变.特别是,DEBUG(-O0)代码往往有很多保留/释放.-Os(优化)代码将有许多优化出来.