2012-02-13 110 views
3

這是一個僅適用於iOS5並支持ARC的Xcode 4.3.1 beta測試版項目。在4.2.1編譯時。 LLVM是投擲警告這樣的:Xcode 4.2.1 ARC問題

「ARC不允許對合成一個Objective-C對象的屬性與 不明所有權或存儲屬性」

所以屬性定義是這樣的:

@property (nonatomic) NSObject* object 

ARC在Build Settings中啓用。添加一個強大的屬性修復了這個警告,但這應該是默認對不對?

Xcode版本在處理這些屬性默認值時有區別嗎?

感謝 安迪

+0

So Xcode 4.3發佈。所以屬性定義不需要存儲屬性。強是默認的,下面的工作沒有問題。 '@property(nonatomic)NSObject * object' – abs 2012-02-20 09:55:50

回答

4

這不是測試特定的Xcode 4.2.1具有相同的行爲(測試版是在保密協議,只能依法在蘋果的開發者論壇中討論):

強是默認設置爲ivar s。對於ivars,如果你想__unsafe_unretained__weak你必須指定。

在屬性聲明中指定屬性一直是最佳實踐。彈出最快想到的例子是UILabel屬性文本,定義爲:

@property(nonatomic,copy) NSString *text; // default is nil 

在這個例子中copy屬性告訴我,我可以通過一個NSMutableString參考標籤,它將使一個副本,我可以繼續突變字符串,標籤將保持不變。行爲是明確的。

我懷疑這是明確定義的行爲,這是ARC編譯器強制您指定存儲屬性的最主要原因。請記住,新的運行時消除了爲屬性聲明ivars和爲存取器方法聲明@synthesize,可以想象的是,如果您意外地保留了一個委託,屬性聲明是您將注意到的唯一一點。

另外考慮一個項目中的幾個類可能已經被排除在ARC之外的可能性,在這些情況下,內部實現對ARC來說是完全不透明的。