2013年7月5日 星期五

Objective-C property屬性


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 安全性較低,但性能較高, 大多數時間都設定為此屬性.

沒有留言:

張貼留言