@property 后面可以有哪些修飾符?

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

readwrite:表明這個屬性是可讀可寫的,系統(tǒng)為我們創(chuàng)建這個屬性的setter和getter方法。

readonly:表明這個屬性只能讀不能寫,系統(tǒng)只為我們創(chuàng)建一個getter方法,不會創(chuàng)建setter方法

2.setter相關(guān)修飾符:assign | retain | copy

setter相關(guān)的修飾符表明setter方法應(yīng)該如何實現(xiàn)

assign:表示直接賦值,用于基本數(shù)據(jù)類型(NSInteger和CGFloat)和C數(shù)據(jù)類型(如int, float, double, char等)另外還有id類型,這個修飾符不會牽涉到內(nèi)存管理。但是如果是對象類型,使用此修飾符則可能會導(dǎo)致內(nèi)存泄漏或EXC_BAD_ACCESS錯誤

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

copy:主要用在NSString類型,表示復(fù)制內(nèi)容。

系統(tǒng)默認(rèn)屬性是assign。retain是指針的復(fù)制,copy是內(nèi)容的復(fù)制

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

atomic:表示是線程安全的。

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

系統(tǒng)默認(rèn)是atomic

4.getter和setter修飾符

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

這兩個屬性修飾符用于設(shè)置自定義生成的getter和setter方法名,使用之后將不再使用系統(tǒng)默認(rèn)的setter和getter方法名。

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

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

Xcode4.3(iOS 5和以上版本)或之后有了ARC用strong和weak

assign:用于非指針變量。用于基礎(chǔ)數(shù)據(jù)類型(如NSInteger, CGFloat)和C數(shù)據(jù)類型(int, float, double, char等), 另外還有id類型。

記?。呵懊娌恍枰樱木陀胊ssign

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

strong類似于retain,weak類似于assign

最簡單的記憶:

使用assign:對基礎(chǔ)數(shù)據(jù)類型(如NSInteger, CGFloat)和C數(shù)據(jù)類型(int, float, double, char等), 另外還有id類型

使用copy:對NSString類型

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

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

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

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

4、當(dāng)在實現(xiàn)文件中這樣寫@synthesize propertyName = varName;時,setter和getter方法所對應(yīng)的是一個名為varName的成員變量,修改和讀取的是varName成員變量的值。

5、當(dāng)我們在實現(xiàn)文件中不寫@synthesize propertyName時,在Xcode 4.5之前的版本不會幫我們自動實現(xiàn)setter和getter方法,系統(tǒng)當(dāng)然也不再會為我們生成對應(yīng)的成員變量。但是在Xcode 4.5之后可以不用寫@synthesize了,就跟3、4一樣了。

6、當(dāng)我們既定義了@synthesize,又在實現(xiàn)文件中人為重寫setter和getter方法時,那么@synthesize將不再工作,也就不會為我們創(chuàng)建沒有定義的_propertyName成員變量了,這時候如果在setter和getter方法中調(diào)用_propertyName將會發(fā)生編譯錯誤!@property 后面可以有哪些修飾符?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容