1

當我宣佈一個屬性,而不使用存儲規範+實例變量,一切工作愉快:使用@property在ARC

@interface Foo : NSObject { 
    NSSomething* mySomething; 
} 
@property (readonly) NSSomething* mySomething; 

然而,當我刪除實例變量聲明,我得到一個編譯錯誤,指出我必須指定存儲類型:

@property (readonly, strong) NSSomething* mySomething; 

這讓我不知道我應該只需要聲明強烈,但它應該是隻讀反正.. 這到底是怎麼回事?我應該在哪種情況下使用哪種方法?

EDIT(對於那些無法複製的問題):

enter image description here enter image description here

+2

我無法複製,有沒有其他信息可以提供?以下是我嘗試的代碼:http://pastebin.com/4Mj1rzHd(使用'clang -fobjc-arc Untitled.m -framework Foundation'編譯) – 2012-04-05 11:58:06

+1

對於其他無法重現的代碼,我認爲這是本地化版本問題使用Xcode 4.2提供的LLVM編譯器,並且您不再在4.3+版本中對此進行警告。我已經用我在4.3下編寫的框架代碼碰到過這個問題,但是人們抱怨4.2下的編譯錯誤。 – 2012-04-07 15:50:55

回答

3

你是不是正確的。如果你只需要它,只要保持只讀。

如果你想爲你合成伊娃,編譯器需要知道是否使它變得強大,弱小或不安全。默認值是轉換爲不安全的未分配(這可能不是你想要的)。其他人則報告說,編譯器在沒有警告的情況下正確處理默認值,但由於遇到問題,您需要在屬性聲明中使用retain屬性。

或者,你可以像你最初一樣聲明自己的伊娃。

+0

編譯器默認爲'assign',請參閱我對@ user1258240的評論。從Apple文檔中:「assign指定setter使用簡單賦值,該屬性是默認值。」 – zaph 2012-04-05 12:40:49

+0

分配等同於不安全的未保留。這可能不是你想要的。編譯器讓你在這裏明確,所以你不會犯任何錯誤。 – wbyoung 2012-04-05 12:42:53

+0

我同意這可能不是我想要的。我創建了一個測試iOS ARC項目,並且不能複製問題,並且根據Apple文檔,不需要設置語義。你有沒有複製這個問題? – zaph 2012-04-05 12:46:41

1

您應該指定強或弱,這取決於您是否願意在其他人停止引用時您的某些內容會消失。如果該屬性基於實例變量,則屬性自動變強。另外,獨立於上述決定,您應該將屬性設置爲只讀,如果您不希望它具有setter(所以沒有人能夠設置yourObject.yourSomthing =某些東西)。這意味着(除非您在.m文件中私下重新聲明該屬性爲readwrite),否則無法直接將您的某個東西設置爲任何東西。如果getter不依賴於變量,而是通過其他方式計算返回值,這會很有用。

+0

您能解釋並提供聲明的文檔:「如果該屬性基於實例變量,則屬性自動變強。」?'assign'是默認的setter語義。請參閱:[Objective-C編程語言](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html) – zaph 2012-04-05 12:34:18

+0

沒有矛盾。強烈意味着屬性指針強烈指向對象,這是一個ivar的情況:它在指向它的對象之前不會被釋放。如果它也具有assign屬性,則意味着我的object.property = something將屬性變量設置爲指向某些東西:這與副本相反,例如,在相同的操作將複製某些內容並使屬性點到新的東西(無論是強還是弱,取決於財產是強還是弱)...... – user1258240 2012-04-05 13:23:24

+0

「如果它也具有賦值屬性」不正確,則只能有一個賦值語義。從上面提到的Apple文檔:「Setter語義:這些屬性指定了set訪問器的語義,它們是互斥的。」 'strong'表示如果有'@ synthesize'指令,它將創建與屬性關鍵字匹配的代碼。 – zaph 2012-04-05 13:34:54