积木和额外的保留

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(优化)代码将有许多优化出来.

  • @Yar您必须消除线程,自动释放池以及ARC的大部分自动行为以实现"有意义"的计数.那时,它将脱离现实而无用.而这首先不是内存管理的工作原理."保留"仅意味着您希望对象保持不变.它没有说明其他什么也可能想要保持对象存活或可能存在多长时间. (3认同)