1. 原子性:nonatomic魂迄、atomic
2. 讀寫:readwrite注服、readonly
3. 方法名:getter<name>、setter<name>
4. 內(nèi)存:strong澎埠、retain虽缕、copy、weak蒲稳、assign氮趋、unsafe_unretain
1.原子性與非原子性
- atomic:原子性伍派,只有一個(gè)線程可以同時(shí)訪問實(shí)例。atomic 是線程安全的(
因?yàn)闀?huì)為setter方法加鎖
)剩胁,至少在當(dāng)前的讀取器是安全的诉植。雖然它是一個(gè)默認(rèn)屬性,但是由于其使用同步鎖開銷較大昵观,會(huì)損耗性能晾腔。- nonatomic:非原子性的,可以被多個(gè)線程訪問索昂。效率要比atomic 高建车,但是不能保證其在多線程狀態(tài)下的安全性,在單線程和明確只有一個(gè)線程訪問的情況下被廣泛使用椒惨。
2.讀寫屬性
- readwrite(默認(rèn)值):表示其同時(shí)擁有g(shù)etter 和 setter 方法缤至;
- readonly:只讀操作,其只有g(shù)etter 方法康谆,沒有setter法
注:如果某個(gè)實(shí)例只允許被外部讀取领斥,而不能寫入操作,同時(shí)在類實(shí)現(xiàn)文件當(dāng)中可以寫入的話沃暗,可以在頭文件中聲明屬性為只讀的月洛,在實(shí)現(xiàn)文件中設(shè)置其為可讀寫的屬性,寫法如下:
//頭文件中聲明為:
@property(nonatomic,readonly,copy) NSString *stringA;
//實(shí)現(xiàn)文件中聲明為:
@property(nonatomic,readwrite,copy) NSString *stringA;
3.內(nèi)存關(guān)鍵詞
- strong表示指向并擁有該對(duì)象孽锥。其修飾的對(duì)象引用計(jì)數(shù)會(huì)增加1嚼黔。該對(duì)象只要引用計(jì)數(shù)不為0則不會(huì)被銷毀。當(dāng)然強(qiáng)行將其設(shè)為nil可以銷毀它惜辑。
- weak表示指向但不擁有該對(duì)象唬涧。其修飾的對(duì)象引用計(jì)數(shù)不會(huì)增加。無需手動(dòng)設(shè)置盛撑,該對(duì)象會(huì)自行在內(nèi)存中銷毀碎节。
- assign主要用于修飾基本數(shù)據(jù)類型,如NSInteger和CGFloat抵卫,這些數(shù)值主要存在于棧上狮荔。
- weak 一般用來修飾對(duì)象,assign一般用來修飾基本數(shù)據(jù)類型介粘。原因是assign修飾的對(duì)象被釋放后殖氏,指針的地址依然存在,造成野指針姻采,在堆上容易造成崩潰雅采。而棧上的內(nèi)存系統(tǒng)會(huì)自動(dòng)處理,不會(huì)造成野指針。
- copy與strong類似总滩。不同之處是strong的復(fù)制是多個(gè)指針指向同一個(gè)地址,而copy的復(fù)制每次會(huì)在內(nèi)存中拷貝一份對(duì)象巡雨,指針指向不同地址闰渔。copy一般用在修飾有可變對(duì)應(yīng)類型的不可變對(duì)象上,如NSString, NSArray, NSDictionary铐望。
- Objective-C 中冈涧,基本數(shù)據(jù)類型的默認(rèn)關(guān)鍵字是atomic, readwrite, assign;普通屬性的默認(rèn)關(guān)鍵字是atomic, readwrite, strong正蛙。
assign:用于值類型(如int督弓,float等)
weak: 用于修飾引用類型
unsafe_unretained:只修飾引用類型
區(qū)別:
1. 三者修飾效果相同,即都不會(huì)更改所賦新值的引用計(jì)數(shù)乒验,也不改變舊值的引用計(jì)數(shù)
2. assign一般只修飾值類型愚隧,雖然也可以修飾引用類型,但是修飾的對(duì)象釋放后锻全,指針不會(huì)自動(dòng)被置空狂塘,此時(shí)向?qū)ο蟀l(fā)消息會(huì)崩潰。
3. weak 不會(huì)產(chǎn)生野指針問題鳄厌。因?yàn)閣eak修飾的對(duì)象釋放后(引用計(jì)數(shù)器值為0)荞胡,指針會(huì)自動(dòng)被置nil,之后再向該對(duì)象發(fā)消息也不會(huì)崩潰了嚎。 weak是安全的泪漂。
4. unsafe_unretained與assign的區(qū)別在于,其只修飾引用類型歪泳。
strong:用于引用類型萝勤,強(qiáng)引用。
retain :用于引用類型夹囚,強(qiáng)引用纵刘。
copy:修飾屬性會(huì)在內(nèi)存里拷貝對(duì)象。
區(qū)別:
1. 三者都用于修飾引用類型荸哟。
2. strong用于ARC假哎,retain用于MRC。
3. copy分為淺層復(fù)制和深復(fù)制兩種鞍历,NSString舵抹、NSArray、NSDictionary等不可變類型都為淺層復(fù)制劣砍,即其引用計(jì)數(shù)會(huì)+1惧蛹,而不會(huì)創(chuàng)建新的內(nèi)存。
淺拷貝:對(duì)內(nèi)存地址的復(fù)制,讓目標(biāo)對(duì)象指針和原對(duì)象指向同一片內(nèi)存空間會(huì)增加引用計(jì)數(shù)
深拷貝:對(duì)對(duì)象內(nèi)容的復(fù)制香嗓,開辟新的內(nèi)存空間
可變對(duì)象的copy和mutableCopy都是深拷貝
不可變對(duì)象的copy是淺拷貝迅腔,mutableCopy是深拷貝
copy方法返回的都是不可變對(duì)象
@property (nonatomic, copy) NSMutableArray * array;這樣寫有什么影響?
因?yàn)閏opy方法返回的都是不可變對(duì)象靠娱,所以array對(duì)象實(shí)際上是不可變的沧烈,如果對(duì)其進(jìn)行可變操作如添加移除對(duì)象,則會(huì)造成程序crash