2013-01-23 59 views
3

我通常会得到一个警告,当我要求自己什么由自我保持块:这是一个保留周期吗?

[self.someView doSomething:^{ 
     self.aVar = @"Hello!"; 
    }]; 

我必须做的:

 __weak SomeObject *weakSelf = self; 
[self.someView doSomething:^{ 
     weakSelf.aVar = @"Hello!"; 
    }]; 

但如果我呼吁weakSelf的方法,以及方法使用自我,这将导致保留周期,即使我没有得到警告?我说的是这样的:

 __weak SomeObject *weakSelf = self; 
[self.someView doSomething:^{ 
     weakSelf.aVar = @"Hello!"; 
     [weakSelf aMethod]; 
    }]; 

和amethod方法使用self

+0

您是否在使用ARC? –

+0

@AKV是的,使用ARC – 0xSina

+0

哦。仍然担心保留周期? –

回答

5

只要您的weakSelfdeclared outside your block,就没有保留周期。

使用块内的对象会隐含增加保留计数。但是你会打电话aMethodweakSelf而不是self,所以保留计数不受影响。

+0

很酷,谢谢!只是想确保它可能是一个间接保留周期,因为a方法使用自我。* – 0xSina

+0

@rckoenes在你做斯蒂芬之前11分钟回答吗? – trojanfoe

+0

@trojanfoe当我回答时,他的回答并没有解决这个问题,尽管它确实突出了一个重要问题(这就是为什么我将其与之联系起来)。 –

2

你应该申报__weakself之外的块:

__weak SomeObject *weakSelf = self; 
[self.someView doSomething:^{ 
    weakSelf.aVar = @"Hello!"; 
    [weakSelf aMethod]; 
}]; 

否则编译器会已保持自我,因为它与块一起使用。

Beter甚至使用__block指令,因为__weak仅适用于iOS 5及更高版本。

__block SomeObject *weakSelf = self; 
[self.someView doSomething:^{ 
    weakSelf.aVar = @"Hello!"; 
    [weakSelf aMethod]; 
}]; 

关于调用self并导致retain的其他方法,我从来没有见过这种行为。我总是使用__block指令,它也可能会捕捉到这个指令。

+0

是的,我知道,这就是我的意思。从SO内写入(而不是从XCode复制粘贴)并完全忘记了这一点。 – 0xSina

+0

更好的是'SomeObject * __weak weakSelf = self;',尽管编译器会原谅你。 – trojanfoe

+0

@trojanfoe为什么? – 0xSina