首先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í)粹断,變量不會自動(dòng)設(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)鍵字會自動(dòng)生成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)前類的子類