2013-05-22 75 views
1

當我們需要調用自身的塊,我們通常做的是這樣的:二傳手不叫塊時調用weakSelf

__typeof(&*self) __weak weakSelf = self; 

的問題是,當你調用塊weakSelf.prop = @"string",二傳手setProp:永遠叫做。

但是,如果你像這樣定義:

__typeof(&*self) fakeSelf = self; 

的問題就迎刃而解了。

任何人都可以解釋爲什麼?還有任何潛在的問題?

+1

首先,'&*'是多餘的(指針解除引用的地址就是一些東西)。其次,如果它沒有被調用,那麼你的類正在被釋放,然後才能在塊中進行評估。 – CodaFi

+1

@CodaFi'&*'曾經用於從自我類型中移除隱含的__strong。不過這不再需要了。 –

+1

「當我們需要在一個街區內自我調用時,我們通常會這樣做:」不「,我們」不「通常會這樣做」。只有當我們以特定的方式使用它時,我們纔會看到存在特定的問題(保留週期)。在許多編碼模式中,通過塊保留'self'是正確工作所必需的。 – newacct

回答

5
  1. typeof是C11的一部分,並作爲clang的舊版本的擴展支持。無需使用(實施私人)__typeof
  2. &*self hackery需要更多。鐺聲支持簡單typeof(self)自一段時間(v3.1,Xcode 4.4)。
  3. weakself.prop = ...總是[weakself setProp:...]的同義詞。聲明目標__weak時這不會改變。

你如何得出結論accessor不會被稱爲?

如果您錯過了日誌消息或斷點命中,可能目標weakSelf已被釋放並且該變量被設置爲零。這當然會阻止訪問者被調用。

+0

謝謝你的精彩答案。但我想知道你怎麼知道第二個答案? – nickcheng