Property 是在Objective-C 2.0之後才有的,主要是方便取存或設定物件裡的實體變數, 系統會幫你寫好 setter 和 getter (在 xcode4.5 之後不需要搭配 @sythesize 這個合成指令, compiler會幫你關聯至在原變數名稱前加上底線 ex _abc).
另外 Property 有幾個屬性可以設定, 語法如下
@property(attribute1, attribute2…)int iVal;
這些屬性分別為
readonly : 唯讀,(compiler 不會幫你合成 setter method)。
readwrite : 可讀可寫(Default)。
assign : 在設值時替換新舊資料(Default)。
retain : 在設值時retain新的資料,release舊資料。
copy : 在設值時copy一份新資料,release舊資料。
strong /weak : iOS5 之後取代 retain 和 copy, 由compiler幫你決定使用那一種.
nonatomic : non safety thread
atomic : safety thread(Default)
assign 就只是單純的將新值賦予變數, 如下
- (void)setX:(int)iVal {
_value = iVal;
}
retain用於物件。會在給值前先 release 舊的值並於新的物件上將其引用計數器+1 後賦予變數, 如下
- (void)setX:(NSString*)sVal {
if (_string != sVal ) {
[_string release];
_string = [sVal retain];
}
}
copy 與 retain 基本上是一樣的, retain 是將該物件的引用計數器+1, 而 copy 會依照類別型態做不同的動作, 這部份還待理解....但是一切在 iOS 5 提出 ARC 後, retain 和 copy 都被 strong 和 weak 取代了, 交由 compiler 幫你決定是用 retain 或是 copy.
strong 跟 retain 沒兩樣, 每次呼叫時都會將引用計數器+1, weak 則只是單純的參照記憶體位址.
weak 最常用的兩個地方是 delegation 中的 id<myDelegate> delegate 和 subviews.
因為所有的 subviews 都被 mainview 所持有, 所以只需參照記憶體位址即可.
atomic 表示若同時有多個地方呼叫該變數的 setter 或 getter 則必須一個一個慢慢來. 較安全, 但效能較低.
nonatomic 表示多人能同時呼叫 setter 和 getter 安全性較低,但性能較高, 大多數時間都設定為此屬性.
沒有留言:
張貼留言