【发布时间】:2014-11-03 11:00:23
【问题描述】:
我一直在使用块,熟悉在块中使用 self 时的内存管理 非 ARC 环境
但我有两个具体问题:
1) 我知道我可以使用 __block 来避免保留循环,保留块反过来使用 self 可以创建,如下所示:
__block MyClass *blockSelf = self;
self.myBlock = ^{
blockSelf.someProperty = abc;
[blockSelf someMethod];
};
这肯定会避免保留周期,但通过这样做,我创建了一个自我释放的范围,并最终被其他人释放。因此,当这种情况发生时,self 消失了,blockSelf 指向了一个垃圾值。在自身被释放后执行块时可能会出现一些情况,然后块将在尝试使用已释放的实例时崩溃。我们怎样才能避免这种情况呢?如何检查blockSelf在block执行时是否有效或在self被释放时停止block执行。
2) 在类似的行上,假设我使用如下块:
__block MyClass *blockSelf = self;
self.myBlock = ^{
[blockSelf someMethod:blockSelf.someProperty];
};
// I am taking someProperty in an method argument
-(void) someMethod:(datatype*)myClassProperty
{
myClassProperty = abc;
}
现在可能会出现 self 没有释放但 someProperty 在 someMethod 的执行开始之前释放的情况(当有多个线程时可能会发生这种情况)。即使我做 self.someProperty = nil;当它被释放时,myClassProperty 不是 nil 并且指向一些垃圾,因此当 someMethod 被执行时,第一行将导致崩溃。我该如何避免这种情况?
【问题讨论】:
-
1) 不应该是
__weak,而不是__block? -
看看dhoerl.wordpress.com/2013/04/23/…(你需要声明它__weak而不是__block)
-
我是非arc环境,所以不能使用__weak。
-
如果
self被释放,谁会调用myBlock?
标签: ios objective-c iphone objective-c-blocks self