assign团甲、copy、retain黍聂、nonatomic躺苦、atomic等關(guān)鍵字介紹

1)一句話介紹

assign: ? ? 簡單的賦值,不改變引用計數(shù)产还。(NSInteger 匹厘、int、 float脐区、 char ...)?

copy: ? ? ? 開辟新的內(nèi)存愈诚,新建一個索引計數(shù)為1的對象,可釋放舊對象。(NSString)

retain: ? ? 是說明該屬性在賦值的時候扰路,先release之前的值,然后再賦新值給屬性倔叼,引用再加1汗唱。

readonly: ? 該對象只能讀取,不能改寫丈攒,只生成getter方法哩罪,不會生成setter方法。

readwrite: ?可讀可寫的對象巡验。

nonatomic:非原子性訪問际插,不加同步,多線程并發(fā)訪問會提高性能显设。

2)換句話說 assign ?and retain 有啥區(qū)別框弛?

現(xiàn)在有這樣一個場景,我分配了一塊內(nèi)存捕捂,并且把它的地址賦值給A指針瑟枫。后來,我希望B指針也可以共享這塊內(nèi)存指攒,于是乎慷妙,我又把A指針(內(nèi)存地址)賦值給了B,這時候咧允悦,A和B就同時擁有這塊內(nèi)存膝擂。

好了,

@property ?(assign, nonatomic) 類型名* A隙弛;

@property? (retain, nonatomic) 類型名* B架馋;

A =[ [ 類型名 alloc] init ] ;? B = A ;

Q:請問當(dāng)A不再需要這塊內(nèi)存,能否直接釋放它驶鹉?

A:? 答案是否定的绩蜻,因為A并不知道B是否還在使用這塊內(nèi)存,如果A釋放了室埋,那么B在使用這塊內(nèi)存的時候會引起程序crash掉办绝。

Q: ?那么如何解決?

A: ?最簡單的一個方法就是使用引用計數(shù)(reference counting)姚淆。我們給那塊內(nèi)存設(shè)一個引用計數(shù)孕蝉,當(dāng)內(nèi)存被分配并且賦值給A時,引用計數(shù)是1腌逢。當(dāng)把A賦值給B時引用計數(shù)增加到2降淮。這時如果A不再使用這塊內(nèi)存,它只需要把引用計數(shù)減1,表明自己不再擁有這塊內(nèi)存佳鳖。B不再使用這塊內(nèi)存時也把引用計數(shù)減1霍殴。當(dāng)引用計數(shù)變?yōu)?的時候,代表該內(nèi)存不再被任何指針?biāo)孟捣裕到y(tǒng)可以把它直接釋放掉来庭。

總的來說:assign就是直接賦值,從而可能引起上面的問題穿挨,當(dāng)數(shù)據(jù)為int, float等原生類型時月弛,可以使用assign。retain使用了引用計數(shù)科盛,retain引起引用計數(shù)加1, release引起引用計數(shù)減1帽衙,當(dāng)引用計數(shù)為0時,dealloc函數(shù)被調(diào)用贞绵,內(nèi)存被回收厉萝。

3)換句話說 copy 到底怎么用?

copy:是在你不希望A和B共享一塊內(nèi)存時會使用到但壮。A和B各自有自己的內(nèi)存冀泻。

NSString、NSArray蜡饵、NSDictionary等等經(jīng)常使用copy關(guān)鍵字弹渔,是因為他們有對應(yīng)的可變類型:NSMutableString、NSMutableArray溯祸、NSMutableDictionary肢专,為確保對象中的屬性值不會無意間變動,應(yīng)該在設(shè)置新屬性值時拷貝一份焦辅,保護其封裝性

block也經(jīng)常使用copy關(guān)鍵字

block 使用 copy 是從 MRC 遺留下來的“傳統(tǒng)”,在 MRC 中,方法內(nèi)部的 block 是在棧區(qū)的,使用 copy 可以把它放到堆區(qū).

在ARC中寫不寫都行:對于 block 使用 copy 還是 strong 效果是一樣的博杖,但是建議寫上copy,因為這樣顯示告知調(diào)用者“編譯器會自動對 block 進行了 copy 操作”

4)nonatomic 和 atomic 的又怎么說筷登?

【摘自網(wǎng)絡(luò) 侵刪】

atomic:默認是有該屬性的剃根,這個屬性是為了保證程序在多線程情況下,編譯器會自動生成一些互斥加鎖代碼前方,避免該變量的讀寫不同步問題狈醉。

nonatomic:如果該對象無需考慮多線程的情況,請加入這個屬性惠险,這樣會讓編譯器少生成一些互斥加鎖代碼苗傅,可以提高效率。

atomic的意思就是setter/getter這個函數(shù)班巩,是一個原語操作渣慕。如果有多個線程同時調(diào)用setter的話,不會出現(xiàn)某一個線程執(zhí)行完setter全部語句之前,另一個線程開始執(zhí)行setter情況逊桦,相當(dāng)于函數(shù)頭尾加了鎖一樣眨猎,可以保證數(shù)據(jù)的完整性。nonatomic不保證setter/getter的原語行强经,所以你可能會取到不完整的東西宵呛。因此,在多線程的環(huán)境下原子操作是非常必要的夕凝,否則有可能會引起錯誤的結(jié)果

- ?(void)setCurrentImage:(UIImage *)currentImage{

? ? ? ? ? ?NSLock *lock = [[NSLock alloc]init];

? ? ? ? ? ?[lock lock];

? ? ? ? ? if (_currentImage != currentImage) {

? ? ? ? ? ? ? ? ? ? ? [_currentImage release];

? ? ? ? ? ? ? ? ? ? ?_currentImage = [currentImage retain];

? ? ? ? ? ? ? ? ? ?// do something

}

}

可以看出來,用atomic會在多線程的設(shè)值取值時加鎖户秤,中間的執(zhí)行層是處于被保護的一種狀態(tài)码秉,atomic是oc使用的一種線程保護技術(shù),基本上來講鸡号,就是防止在寫入未完成的時候被另外一個線程讀取转砖,造成數(shù)據(jù)錯誤。而這種機制是耗費系統(tǒng)資源的鲸伴,所以在iPhone這種小型設(shè)備上府蔗,如果沒有使用多線程間的通訊編程,那么nonatomic是一個非常好的選擇汞窗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末姓赤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子仲吏,更是在濱河造成了極大的恐慌不铆,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裹唆,死亡現(xiàn)場離奇詭異誓斥,居然都是意外死亡,警方通過查閱死者的電腦和手機许帐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門劳坑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人成畦,你說我怎么就攤上這事距芬。” “怎么了羡鸥?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵蔑穴,是天一觀的道長。 經(jīng)常有香客問我惧浴,道長存和,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮捐腿,結(jié)果婚禮上纵朋,老公的妹妹穿的比我還像新娘。我一直安慰自己茄袖,他們只是感情好操软,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宪祥,像睡著了一般聂薪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蝗羊,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天藏澳,我揣著相機與錄音,去河邊找鬼耀找。 笑死翔悠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的野芒。 我是一名探鬼主播蓄愁,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼狞悲!你這毒婦竟也來了撮抓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤摇锋,失蹤者是張志新(化名)和其女友劉穎胀滚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乱投,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡咽笼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了戚炫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剑刑。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖双肤,靈堂內(nèi)的尸體忽然破棺而出施掏,到底是詐尸還是另有隱情,我是刑警寧澤茅糜,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布七芭,位于F島的核電站,受9級特大地震影響蔑赘,放射性物質(zhì)發(fā)生泄漏狸驳。R本人自食惡果不足惜预明,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望耙箍。 院中可真熱鬧撰糠,春花似錦、人聲如沸辩昆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汁针。三九已至术辐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間施无,已是汗流浹背术吗。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留帆精,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓隧魄,卻偏偏與公主長得像卓练,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子购啄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容