1.讀寫(xiě)性修飾符:readwrite | readonly
readwrite:表明這個(gè)屬性是可讀可寫(xiě)的,系統(tǒng)為我們創(chuàng)建這個(gè)屬性的setter和getter方法谬以。
readonly:表明這個(gè)屬性只能讀不能寫(xiě),系統(tǒng)只為我們創(chuàng)建一個(gè)getter方法为黎,不會(huì)創(chuàng)建setter方法
2.setter相關(guān)修飾符:assign | retain | copy
setter相關(guān)的修飾符表明setter方法應(yīng)該如何實(shí)現(xiàn)
assign:表示直接賦值邮丰,用于基本數(shù)據(jù)類(lèi)型(NSInteger和CGFloat)和C數(shù)據(jù)類(lèi)型(如int, float, double, char等)另外還有id類(lèi)型铭乾,這個(gè)修飾符不會(huì)牽涉到內(nèi)存管理剪廉。但是如果是對(duì)象類(lèi)型炕檩,使用此修飾符則可能會(huì)導(dǎo)致內(nèi)存泄漏或EXC_BAD_ACCESS錯(cuò)誤
retain:針對(duì)對(duì)象類(lèi)型進(jìn)行內(nèi)存管理斗蒋。如果對(duì)基本數(shù)據(jù)類(lèi)型使用笛质,則Xcode會(huì)直接報(bào)錯(cuò)泉沾。當(dāng)給對(duì)象類(lèi)型使用此修飾符時(shí)经瓷,setter方法會(huì)先將舊的對(duì)象屬性release掉爆哑,再對(duì)新的對(duì)象進(jìn)行一次賦值并進(jìn)行一次retain操作
copy:主要用在NSString類(lèi)型舆吮,表示復(fù)制內(nèi)容揭朝。
系統(tǒng)默認(rèn)屬性是assign色冀。retain是指針的復(fù)制潭袱,copy是內(nèi)容的復(fù)制
3.原子性修飾符:atomic | nonatomic
atomic:表示是線(xiàn)程安全的锋恬。
nonatomic:表示是非線(xiàn)程安全的屯换,使用此屬性性能會(huì)提高一些。
系統(tǒng)默認(rèn)是atomic
4.getter和setter修飾符
@property(getter = getMethodName, setter = setMethodName) Object *obj;
這兩個(gè)屬性修飾符用于設(shè)置自定義生成的getter和setter方法名与学,使用之后將不再使用系統(tǒng)默認(rèn)的setter和getter方法名彤悔。
在@property修飾符中可以出現(xiàn)多個(gè)修飾符索守,分別用逗號(hào)分隔晕窑,但是卵佛,在上述修飾符中杨赤,1截汪,2疾牲,3組中的屬性分別之恩那個(gè)出現(xiàn)一個(gè)衙解,只有4中可以同時(shí)出現(xiàn)阳柔。
Xcode4.2(iOS sdk4.3和以下版本)和以前的版本用retain和assign
Xcode4.3(iOS 5和以上版本)或之后有了ARC用strong和weak
assign:用于非指針變量蚓峦。用于基礎(chǔ)數(shù)據(jù)類(lèi)型(如NSInteger, CGFloat)和C數(shù)據(jù)類(lèi)型(int, float, double, char等), 另外還有id類(lèi)型盔沫。
記住:前面不需要加*的就用assign
retain:用于指針變量架诞。一般用于字符串(NSString, NSMutableString), 數(shù)組(NSMutableArray, NSArray),字典對(duì)象干茉,視圖對(duì)象(UIView)谴忧,控制器對(duì)象(UIViewController)等
strong類(lèi)似于retain角虫,weak類(lèi)似于assign
最簡(jiǎn)單的記憶:
使用assign:對(duì)基礎(chǔ)數(shù)據(jù)類(lèi)型(如NSInteger, CGFloat)和C數(shù)據(jù)類(lèi)型(int, float, double, char等), 另外還有id類(lèi)型
使用copy:對(duì)NSString類(lèi)型
使用retain:對(duì)其它NSObject和其子類(lèi)
1沾谓、在頭文件中用@property聲明一個(gè)屬性名戳鹅,編譯器會(huì)自動(dòng)為我們轉(zhuǎn)換成這個(gè)屬性名的getter方法和setter方法均驶。
2枫虏、在實(shí)現(xiàn)文件中使用@synthesize propertyName妇穴,編譯器先會(huì)查找這個(gè)屬性名的setter方法和getter方法有沒(méi)有被人為實(shí)現(xiàn)隶债,如果已經(jīng)實(shí)現(xiàn)腾它,則不再實(shí)現(xiàn)死讹,如果沒(méi)有,則會(huì)幫我們生成一個(gè)屬性命的setter方法和getter方法赞警。
3、當(dāng)在實(shí)現(xiàn)文件中使用了@synthesize propertyName愧旦,編譯器還會(huì)做一件事情,在類(lèi)成員變量中查找一個(gè)名為_(kāi)propertyName的成員變量忘瓦,如果沒(méi)有搁廓,再繼續(xù)查找名為propertyName的成員變量耕皮,如果這兩個(gè)都沒(méi)有境蜕,編譯器會(huì)自動(dòng)為我們生成一個(gè)私有的名為_(kāi)propertyName的成員變量凌停。注意粱年,系統(tǒng)自動(dòng)創(chuàng)建的都是私有的罚拟。
4台诗、當(dāng)在實(shí)現(xiàn)文件中這樣寫(xiě)@synthesize propertyName = varName;時(shí),setter和getter方法所對(duì)應(yīng)的是一個(gè)名為varName的成員變量拉队,修改和讀取的是varName成員變量的值。
5粱快、當(dāng)我們?cè)趯?shí)現(xiàn)文件中不寫(xiě)@synthesize propertyName時(shí)秩彤,在Xcode 4.5之前的版本不會(huì)幫我們自動(dòng)實(shí)現(xiàn)setter和getter方法事哭,系統(tǒng)當(dāng)然也不再會(huì)為我們生成對(duì)應(yīng)的成員變量漫雷。但是在Xcode 4.5之后可以不用寫(xiě)@synthesize了鳍咱,就跟3降盹、4一樣了谤辜。
6蓄坏、當(dāng)我們既定義了@synthesize每辟,又在實(shí)現(xiàn)文件中人為重寫(xiě)setter和getter方法時(shí),那么@synthesize將不再工作渠欺,也就不會(huì)為我們創(chuàng)建沒(méi)有定義的_propertyName成員變量了妹蔽,這時(shí)候如果在setter和getter方法中調(diào)用_propertyName將會(huì)發(fā)生編譯錯(cuò)誤挠将!@property 后面可以有哪些修飾符?