[英]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下,在许多情况下,块将自动复制到堆中,并在复制块时触发捕获对象的保留。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.