我对块做一些研究,代码在这里
typedef NSString* (^MyBlock)(void);
@property(copy,nonatomic) MyBlock block1;
在视图didload
self.block1 = ^{
self
NSLog(@"do block");
return @"a";
};
当然保留自我,然后我做一个
self.block = nil;
通过检查self的retain count,我发现它减少了1,没有retain循环。
我相信这是正确的情况,块保留自我,当释放块时,自我被释放。保留计数减少。
我做了一个小小的改变,事情变得很奇怪:让块成为一个局部变量。
在视图didload
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 让它变得不同,有什么解释吗?