2013-01-23 61 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