2012-02-23 188 views
0

我在一些演示代碼看過這個:屬性:「分配」與「只讀」

@property (readonly) SomeObject* someInstance;

什麼是缺乏在我的眼裏是要麼轉讓,複製或保留任何提及;如果省略,它是什麼類型的指針?顯然,這是某種形式的指針,但我認爲在沒有retaincopy所有的指針,簡直是assign,因爲他們簡單地指向和平等一切someInstance是。

但我不想做這樣的假設。我發現,這些屬性看起來似乎很容易理解,但實際上這個概念可能有點困難。

回答

2

其他值(保留,複製,轉讓),只有不管你什麼時候有一個setter參與。用這些屬性生成的任何getter都是一樣的。保留,複製或分配只有在設置值時才適用,因爲您正在更改setter對傳入對象執行的操作。由於此屬性是隻讀的,這意味着您只創建一個getter來返回對象的指針,無所謂其他什麼是因爲你無法設置它。

+0

如果你只是簡單地調用'someInstance'而沒有點符號,那麼'@ property'聲明都不重要,對嗎?因爲那你可以設置它或做任何你想做的事,對吧?只有當你使用點符號時,你將無法設置它,對嗎? – johnbakers 2012-02-23 04:49:49

+0

正確,如果您只是直接在代碼中調用實例變量,而不通過點語法或方括號調用setter/getter,則屬性不適用。 – 2012-02-23 04:52:33

+0

除非你使用ARC,否則我應該加上,然後強弱無關,但這是一個不同的故事。 – 2012-02-23 04:54:21

1

如果您未使用ARC,則assign,retaincopy屬性僅影響屬性的編譯器生成的setter方法。由於編譯器不會爲readonly屬性生成setter方法,因此不需要指定任何這些屬性。

它可以是無論如何指定其中一個,如果你提供的,用戶可以設置該屬性,記錄您的屬性​​值的所有權(或沒有)一些其他的方法有用。

如果您正在使用ARC和@synthesize,財產的所有權必須實例變量的所有權相匹配。如果讓編譯器生成實例變量,它將自動將屬性的所有權屬性應用於實例變量。

+0

@property聲明都不重要,如果你只是簡單地調用someInstance沒有點符號,對吧?因爲那你可以設置它或做任何你想做的事,對吧?只有當你使用點符號時,你將無法設置它,對嗎? – johnbakers 2012-02-23 04:50:37

+0

如果您不使用ARC,並且直接訪問實例變量,則它們都不重要。如果您使用的是ARC,則聲明的所有權必須與實例變量的所有權匹配。如果你正在使用ARC,並讓'@ synthesize'創建實例變量,它會自動將屬性聲明中的所有權限制從屬性聲明覆制到實例變量。 – 2012-02-23 04:53:39

+0

我修改了我的答案來討論ARC與非ARC。 – 2012-02-23 04:56:06

1
**readonly** 
Indicates that the property is read-only. 
If you specify readonly, only a getter method is required in the @implementation block. If you use the @synthesize directive in the implementation block, only the getter method is synthesized. Moreover, if you attempt to assign a value using the dot syntax, you get a compiler error. 

**assign** 
Specifies that the setter uses simple assignment. This attribute is the default. 
You use this attribute for scalar types such as NSInteger and CGRect. 

只讀是可寫之一。有2,readwrite(默認)和只讀。

分配是二傳手語義之一。像保留/複製等

Apple Documentation

相關問題