2014-03-06 66 views
13

我有一種情況,我不想爲一組屬性合成實例變量(我通過用戶默認值和鑰匙串管理它們)。具有自定義getter的只讀屬性是否具有合成的實例變量?

如果我有以下,_loginUsername將肯定合成:

@property (nonatomic, readonly) NSString *loginUsername; 

而且我知道如果我有下面的實例變量不會被合成的,因爲聲明說:「我要照顧它自己「:

@property (nonatomic, getter = loginUsername, setter = setLoginUsername) NSString *loginUsername; 

是行爲同樣具有自定義的getter?:

@property (nonatomic, readonly, getter = loginUsername) NSString *loginUsername; 
只讀屬性

是否有_loginUsername合成最終財產聲明?我相當確信不會有,但我試圖更好地掌握財產屬性,所以想確保我沒有失去方向。

解釋在編譯時是否知道這個獎勵點(沒有作弊和檢查Xcode!)。

我的執行文件中沒有任何@synthesize語句。

+4

等等,什麼? –

+0

@ChrisWagner - 好的,你可以檢查Xcode :)但我想知道它是如何知道預運行時。我想只是簡單的靜態分析 - 我想不出更復雜的場景,這會在編譯時導致不確定性。 – bdalziel

+0

我不知道具體情況是否足以回答這個問題,但我會用'@property(nonatomic ,只讀,getter = loginUsername)NSString * loginUsername;'我仍然可以在我的實現中編譯具有'_loginUsername = nil;'的代碼。此外,當我有'@property(nonatomic,只讀,getter = loginUsername,setter = setLoginUsername :) NSString * loginUsername時,我仍然可以做到這一點'''好像文件是謊言! –

回答

23

注:編譯器會自動合成一個實例變量 在它也是合成至少一個訪問 方法的所有情況。如果爲讀寫 屬性或只讀屬性的getter實現了getter和setter,則編譯器將 假定您正在控制屬性實現 ,並且不會自動合成實例變量。如果您仍然需要 一個實例變量,則需要申請一個是 合成

Programming with Objective-c - Encapsulating data - !「沒有作弊,並在Xcode檢查」 下可以實現自定義存取方法

+0

賓果!那是我的直覺。感謝您清除@ m-porooshani – bdalziel

+0

@bdalziel我已經有一段時間的蘋果開發者了,但我一直很喜歡閱讀蘋果的編程指南,他們簡直棒極了,他們闡明瞭既平凡又重要的主題,最有可能在我們的日常工作中看不見。給他們一個嘗試。我回答了你的問題,因爲我記得幾周前我在我的答案中提到的指南中已經閱讀過它。像我的朋友一樣好。 –

相關問題