【发布时间】:2013-09-04 11:35:10
【问题描述】:
我正在对积木进行一些研究, 代码在这里
typedef NSString* (^MyBlock)(void);
@property(copy,nonatomic) MyBlock block1;
在viewdidload中
self.block1 = ^{
self
NSLog(@"do block");
return @"a";
};
当然保留self,那我做个
self.block = nil;
通过查看self的retain count,发现减1,没有retain循环。
我相信这是正确的情况,块保留自我,当释放块时,自我被释放。保留计数减少。
我做了一点改变,但事情变得很奇怪: 使块成为局部变量。
在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中这样做,一个局部变量块会做retain循环,而一个实例变量没有,由于autorelease,它持有self,几秒钟后,它释放了,self对象被正常释放.
是不是因为实例变量和局部变量分配在内存的不同部分?堆 ?堆?,当做[块复制]时,它们是否都被复制到堆中?
编辑: 不是实例变量和局部变量。使用@property 会有所不同,有什么解释吗?
【问题讨论】:
-
ok,我搞错了,self.block比我做的多,它会做block =[block copy] which copy block to heap,并分配一个新地址,没有这个,做block copy 复制块,但是块释放是在栈块地址上,没用,所以现在事情清楚了。
-
复制发生在分配,而不是检索。
标签: objective-c objective-c-blocks self retain