2012-05-21 23 views
3

我使用的是AppCode,它在一個非常大的項目的代碼中標記了一個有趣的情況。弧前。iOS:不明確的屬性綜合行爲。遺傳相關

子類定義併合成一個名爲delegate的屬性。其實財產聲明已被註釋掉!但是@synthesize delegate = delegate_;聲明落後了。

代碼編譯,大概是因爲基類定義和綜合屬性也被稱爲委託,並與具有相同名稱的後盾變量合成它:@synthesize delegate = delegate_;

我的問題是:有消息會發生什麼被髮送到委託在子類的方法

a)所述基類的方法及

b)中。

AppCode標誌在子類的合成語句作爲一個錯誤:

Accessors of property 'delegate' were already synthesized with instance variable 'delegate_'

+1

委託獲取器/設置器被子類的綜合覆蓋,因此不再有對基類實現的訪問(除非深入到技巧的ObjectiveC運行時框中)。 – Till

回答

5

@synthesize指令是速記用於創建存取方法,並根據規格(原子性,存儲器管理)的實例變量同名的財產。鑑於此,在子類中重新合成屬性(不重新聲明它)就像覆蓋訪問器方法一樣 - 使用子類的實現而不是超類。由於這兩種情況下編譯器都創建了這些實現,因此在行爲上沒有明顯差異。

其中一個區別是合成的伊娃與伊瓦爾的@private具有相同的可見性,因此子類無法訪問它,包括將其用作屬性的後備變量。這意味着子類中的重新合成必須使用不同的伊娃名稱。如果超有@synthesize wildHorses = wildHorses_;,那麼編譯器要求子類做類似的東西@synthesize wildHorses = equusFerus; *


*如果超類使用默認名稱爲創建伊娃,@synthesize wildHorses;則子類必須仍合成一個新的變量: @synthesize wildHorses = wildHorses_;