iOS objective-c 屬性關(guān)鍵字

首先iOS objective - C有以下屬性關(guān)鍵字
strong
weak
assign
atomic
nonatomic
readwrite
readonly
copy
unsafe_unretained
retain

iOS9的幾個(gè)新關(guān)鍵字(nonnull、nullable、null_resettable、__null_unspecified 、__kindof)

基本數(shù)據(jù)類型的默認(rèn)關(guān)鍵字為 atomic, assign, readwrite
普通屬性的默認(rèn)關(guān)鍵字為 atomic, strong, readwrite

屬性關(guān)鍵字大致可分為三類:
1.表示原子性的
atomic:原子性,線程安全(其實(shí)只是setter, getter方法是原子操作,線程安全)
nonatomic:非原子性,非線程安全

2.表示引用計(jì)數(shù)的
strong:強(qiáng)引用,引用計(jì)數(shù)加1
weak:弱引用,不增加引用計(jì)數(shù)
retain:和strong相同
assign:用來修飾基本數(shù)據(jù)類型
copy:創(chuàng)建一個(gè)新對象
unsafe_unretained:跟 weak 類似,聲明一個(gè)弱引用,但是當(dāng)引用計(jì)數(shù)為 0 時(shí),變量不會自動設(shè)置為 nil

3.表示讀寫權(quán)限的
readonly:只讀
readwrite:讀寫

原子性相關(guān)關(guān)鍵字 atomic / nonatomic

atomic
關(guān)鍵字修飾后的屬性會保證該屬性的getter,setter方法是原子性的,為了保證其原子性,在getter,setter方法中加了鎖, 而這種機(jī)制是耗費(fèi)系統(tǒng)資源的.
當(dāng)屬性為基本數(shù)據(jù)類型時(shí)使用atomic可以保證線程安全
當(dāng)屬性為普通屬性時(shí), 只對getter,setter方法做處理是無法保證線程安全的,因?yàn)橛锌赡苓@個(gè)屬性是一個(gè)對象, 當(dāng)對這個(gè)對象里面的其他屬性做操作時(shí)就無法保證了.

nonatomic
為非原子性,不會對getter,setter方法加鎖, 所以執(zhí)行速度就會比atomic快,消耗資源也沒有atomic多.
所以我們一般使用nonatomic

引用計(jì)數(shù)相關(guān)關(guān)鍵字 strong/weak/assign/retain/copy/unsafe_unretained

strong
使用strong會對對象強(qiáng)引用, 會增加對象的引用計(jì)數(shù)

@property (nonatomic, strong) Person *B;
Person *A = [Person new];
B = A;
A = nil;
此時(shí)B不為nil

weak
對對象弱引用,不會增加引用計(jì)數(shù),當(dāng)所指向的對象為nil,時(shí)當(dāng)前對象也為nil.

@property (nonatomic, weak) Person *B;
Person *A = [Person new];
B = A;
A = nil;
此時(shí)B也為nil

assign
常用語基本數(shù)據(jù)類型如NSNumber CGFloat 等

retain
strong作用相同,MRC時(shí)留下的

copy
會重新copy一個(gè)新的對象, 一般用于NSString, NSArray, 如果是自定義對象則需要實(shí)現(xiàn)NSCopying協(xié)議

unsafe_unretained
這個(gè)關(guān)鍵字和 week 非常相似, 也是可以同時(shí)修飾基本數(shù)據(jù)類型和 NSObject 對象 ,其實(shí)它本身是 week 的前身 , 在 iOS5 之后,基本都用 week 代替了 unsafe_unretained 。 但它們之間還是稍微有點(diǎn)區(qū)別的,并不是完全一樣,對上層代碼來說,能用 unsafe_unretained 的地方,都可以用 week 代替。同時(shí)要注意一點(diǎn),這個(gè)修飾符修飾的變量不屬于編譯器的內(nèi)存管理對象。

讀寫權(quán)限相關(guān)關(guān)鍵字 readonly / readwrite

readwrite
使用該關(guān)鍵字會自動生成setter/getter方法

readonly
只會生成getter方法

iOS9的幾個(gè)新關(guān)鍵字(nonnull、nullable、null_resettable、__null_unspecified 、__kindof)

nonnull
表示該屬性不能為空

nullable
表示可以為空

null_resettable
get 不能返回空, set 可以為空(注意:如果使用null_resettable,必須重寫 get 方法或者 set 方法,處理傳遞的值為空的情況))

__null_unspecified
不確定是否為空

__kindof
放在類型前面,表示修飾這個(gè)類型(__kindof MyCustomClass *)
表示當(dāng)前類,也可以表示當(dāng)前類的子類

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

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

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