繁体   English   中英

iOS区块释放和自我保留周期

[英]iOS block release and self retain cycle

我正在对块进行一些研究,这里的代码

typedef NSString* (^MyBlock)(void);
@property(copy,nonatomic) MyBlock block1;

在viewdidload

self.block1 = ^{
    self
    NSLog(@"do block");
    return @"a";
};

当然,自我被保留,然后我做一个

self.block = nil;

通过检查自己的保留计数,我发现它减少了1,没有保留周期。

我相信这是正确的情况,该块保留了自身,释放块时,其自身被释放了。 保留数减少。

我做了一个小小的改变,事情变得奇怪了:make block是一个局部变量。

在viewdidload

MyBlock block1 = ^{
    self
    NSLog(@"do block");
    return @"a";
};

[block copy]; // retain count of self gets added.
[block release];  // retain count of sell still the same

为什么? 我尝试了Block_release(),同样。 当将类似NSArray的局部变量放入块中时,保留计数与self的规则相同。

@property内部一定有一些不同的东西,以前有人研究过吗? 请帮助。

另外,我在ARC中执行此操作,局部变量块将导致保留周期,而实例变量则没有,由于自动释放,它保留了self,几秒钟后,它释放了并且self对象正常释放了。

是因为实例变量和局部变量分配在内存中的不同部分吗? 堆栈? 堆?,它们在执行[块复制]时是否都复制到堆上?

编辑:不是实例变量和局部变量。 使用@property会有所不同,有什么解释吗?

问题在于,使用retainCount来找出类似的事情是徒劳的。 retainCount将不会反映autorelease状态,并且编译器(尤其是ARC编译器)可能会生成不同的代码(特别是,优化程序倾向于消除不必要的保留/自动释放对)。

使用分配工具并打开参考事件跟踪。 然后,你可以看看每个对象,确切的堆栈跟踪它发生在保留/释放事件,并知道到底是怎么回事。

在非ARC下,当您分配给iVar时,什么也不会发生。 当您通过设置器时, retain设置器将使对象被retain d。 在ARC下,在许多情况下,块将自动复制到堆中,并在复制块时触发捕获对象的保留。

http://www.whentouseretaincount.com/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM