2012-04-05 65 views
6

我有一個屬性,我不合成,而是我自己創建一個getter和setter。因此,我認爲,ARC關鍵字(強或弱)沒有意義,所以我將它們消除。這在Xcode 4.3上可以正常工作,但是當我的同事在XCode 4.2上打開它們時,編譯器會抱怨沒有強/弱關鍵字,所以我指示他再次無意義地輸入關鍵字。哪一個是正確的(有或沒有關鍵字)?我是否需要ARC關鍵字來處理我沒有合成的屬性?

要明確:我有這樣@property (nonatomic) NSString *foo屬性,並在.m文件我實現-(NSString *)foo-(void)setFoo:(NSString *)foo,不包括@synthesize foo。另一個相關細節是沒有對應的iVar,而是屬性與Core Data對象進行交互。這不會在XCode 4.2中編譯,除非我爲關鍵字添加強或弱。

編輯我想到了一個更相關的東西,其中一個屬性是在一個協議上,我不知道這是否有所作爲。

回答

1

您引用的聲明屬性是可選的。引述文件:

財產申報和實施
的@property指令聲明的屬性。一個可選的加括號 屬性組提供了有關存儲 語義和屬性的其他行爲的額外細節 - 有關可能的值,請參閱「屬性聲明屬性」。

財產申報屬性
可以使用的形式@property(attribute [, attribute2, ...])裝飾用 屬性的屬性。 與方法類似,屬性的範圍限定在它們的封裝接口 聲明中。對於使用變量名稱的逗號分隔列表 的屬性聲明,屬性屬性將應用於所有指定的 屬性。

如果使用@synthesize指令告訴編譯器創建 存取方法(見「財產執行指令」),它生成的代碼 通過關鍵字給出的規格相匹配。如果 您自己實現訪問方法,則應確保其 與規範相匹配(例如,如果指定了副本,則必須 確保您在setter方法中複製輸入值)。

如果再使用@dynamic代替@synthesize它告訴你會寫自己的方法並阻止它抱怨,當它沒有找到合適的方法編譯器。

更多信息可查詢here

+0

有趣...我會嘗試添加動態,看看它是否適用於XCode 4.2 – borrrden 2012-04-05 23:48:56

+1

+1,非常明確的答案 – jmstone617 2012-04-06 13:27:13

0

borrrden,

首先,你爲什麼要關心的Elid你的記憶政策在你的屬性語句?它向您的班級的消費者宣佈該政策是什麼。你不想讓他們知道嗎?

其次,@synthesize不是一個nop。這是語言支持KVO的機制。雖然你現在可能沒有使用它,但爲什麼你會在未來使用這種方法。

坦率地說,通過不使用@property中的完整描述或使用@synthesize,您就是IMO參與過早優化。您當前的設計不救你的消息分派和力量如果必要的話,您可以管理,創建和實例變量的類型。你正在失去語言的特徵。

除非你有一個很好的理由,以獲得最好的OBJ-C V2 +模式的邊界之外,你還沒有上市的話,我會恢復使用標準模式。那麼你的問題就會消失。

Andrew

+0

通常有很好的理由來編寫自己的方法。 (如計算屬性,驗證等) – lnafziger 2012-04-05 22:27:28

+0

'@ synthesize'與KVO完全沒有關係。您可以使用KVO,而無需編寫'@ synthesize',同時提供您自己的定製setter和getters。 – 2012-04-05 22:35:42

+0

這不是關於優化,而是關於邏輯。這些屬性沒有iVar這些屬性通過依次設置它們的屬性與Core Data對象進行交互。在這種情況下,你認爲他們是強還是弱?也許和我設置的後續對象屬性一樣。只要不引起任何副作用,我不介意將它們寫入。 – borrrden 2012-04-05 23:48:18

相關問題