@property屬性修飾符

1.讀寫性修飾符:readwrite | readonly

readwrite:表明這個屬性是可讀可寫的,系統爲我們創建這個屬性的settergetter方法。

readonly:表明這個屬性只能讀不能寫,系統只爲我們創建一個getter方法,不會創建setter方法

2.setter相關修飾符:assign | retain | copy   

setter相關的修飾符表明setter方法應該如何實現

assign:表示直接賦值,用於基本數據類型(NSIntegerCGFloat)C數據類型(int, float, double, char)另外還有id類型,這個修飾符不會牽涉到內存管理。但是如果是對象類型,使用此修飾符則可能會導致內存泄漏或EXC_BAD_ACCESS錯誤

retain:針對對象類型進行內存管理。如果對基本數據類型使用,則Xcode會直接報錯。當給對象類型使用此修飾符時,setter方法會先將舊的對象屬性release掉,再對新的對象進行一次賦值並進行一次retain操作

copy:主要用在NSString類型,表示複製內容。

系統默認屬性是assignretain是指針的複製,copy是內容的複製

3.原子性修飾符:atomic | nonatomic

atomic:表示是線程安全的。

nonatomic:表示是非線程安全的,使用此屬性性能會提高一些。

系統默認是atomic

4.gettersetter修飾符

@property(getter = getMethodName, setter = setMethodName) Object *obj;

這兩個屬性修飾符用於設置自定義生成的gettersetter方法名,使用之後將不再使用系統默認的settergetter方法名。


@property修飾符中可以出現多個修飾符,分別用逗號分隔,但是,在上述修飾符中,123組中的屬性分別之恩那個出現一個,只有4中可以同時出現。


Xcode4.2(iOS sdk4.3和以下版本)和以前的版本用retainassign

Xcode4.3(iOS 5和以上版本)或之後有了ARCstrongweak

assign:用於非指針變量。用於基礎數據類型(NSInteger, CGFloat)C數據類型(int, float, double, char), 另外還有id類型。

              記住:前面不需要加*的就用assign

retain:用於指針變量。一般用於字符串(NSString, NSMutableString), 數組(NSMutableArray, NSArray),字典對象,視圖對象(UIView),控制器對象(UIViewController)

strong類似於retainweak類似於assign


最簡單的記憶:使用assign:對基礎數據類型(NSInteger, CGFloat)C數據類型(int, float, double, char), 另外還有id類型

使用copy:NSString類型

使用retain:對其它NSObject和其子類


1
、在頭文件中用@property聲明一個屬性名,編譯器會自動爲我們轉換成這個屬性名的getter方法和setter方法。

2、在實現文件中使用@synthesize propertyName,編譯器先會查找這個屬性名的setter方法和getter方法有沒有被人爲實現,如果已經實現,則不再實現,如果沒有,則會幫我們生成一個屬性命的setter方法和getter方法。

3、當在實現文件中使用了@synthesize propertyName,編譯器還會做一件事情,在類成員變量中查找一個名爲_propertyName的成員變量,如果沒有,再繼續查找名爲propertyName的成員變量,如果這兩個都沒有,編譯器會自動爲我們生成一個私有的名爲_propertyName的成員變量。注意,系統自動創建的都是私有的。

4、當在實現文件中這樣寫@synthesize propertyName = varName;時,settergetter方法所對應的是一個名爲varName的成員變量,修改和讀取的是varName成員變量的值。

5、當我們在實現文件中不寫@synthesize propertyName時,在Xcode 4.5之前的版本不會幫我們自動實現settergetter方法,系統當然也不再會爲我們生成對應的成員變量。但是在Xcode 4.5之後可以不用寫@synthesize了,就跟34一樣了。

6、當我們既定義了@synthesize,又在實現文件中人爲重寫settergetter方法時,那麼@synthesize將不再工作,也就不會爲我們創建沒有定義的_propertyName成員變量了,這時候如果在settergetter方法中調用_propertyName將會發生編譯錯誤!


發佈了24 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章