回顧retain,copy担映,assign

retain是指針拷貝,copy是內(nèi)容拷貝叫潦。在拷貝之前蝇完,都會釋放舊的對象。

?使用assign: 對基礎(chǔ)數(shù)據(jù)類型 (NSInteger)和C數(shù)據(jù)類型(int, float, double, char,等)
?使用copy: 對NSString
?使用retain: 對其他NSObject和其子類

assign: 簡單賦值矗蕊,不更改索引計數(shù)(Reference Counting)短蜕。
copy: 建立一個索引計數(shù)為1的對象,然后釋放舊對象
retain:釋放舊的對象傻咖,將舊對象的值賦予輸入對象朋魔,再提高輸入對象的索引計數(shù)為1

retain和copy還有assign的區(qū)別?

1.假設(shè)你用malloc分配了一塊內(nèi)存卿操,并且把它的地址賦值給了指針a警检,后來你希望指針b也共享這塊內(nèi)存,于是你又把a(bǔ)賦值給(assign)了b害淤。此時a和b指向同一塊內(nèi)存扇雕,請問當(dāng)a不再需要這塊內(nèi)存,能否直接釋放它窥摄?答案是否定的镶奉,因?yàn)閍并不知道b是否還在使用這塊內(nèi)存,如果a釋放了,那么b在使用這塊內(nèi)存的時候會引起程序crash掉哨苛。

2.了解到1中assign的問題鸽凶,那么如何解決?最簡單的一個方法就是使用引用計數(shù)(reference counting)建峭,還是上面的那個例子吱瘩,我們給那塊內(nèi)存設(shè)一個引用計數(shù),當(dāng)內(nèi)存被分配并且賦值給a時迹缀,引用計數(shù)是1使碾。當(dāng)把a(bǔ)賦值給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)可以把它直接釋放掉灰蛙。

3.上面兩點(diǎn)其實(shí)就是assign和retain的區(qū)別祟剔,assign就是直接賦值,從而可能引起1中的問題摩梧,當(dāng)數(shù)據(jù)為int, float等原生類型時物延,可以使用assign。retain就如2中所述仅父,使用了引用計數(shù)叛薯,retain引起引用計數(shù)加1, release引起引用計數(shù)減1,當(dāng)引用計數(shù)為0時笙纤,dealloc函數(shù)被調(diào)用耗溜,內(nèi)存被回收。

4.copy是在你不希望a和b共享一塊內(nèi)存時會使用到省容。a和b各自有自己的內(nèi)存抖拴。

5.atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。
在多線程環(huán)境下腥椒,原子操作是必要的阿宅,否則有可能引起錯誤的結(jié)果。

atomic: 原子操作(原子性是指事務(wù)的一個完整操作寞酿,操作成功就提交家夺,反之就回滾. 原子操作就是指具有原子性的操作)在objective-c 屬性設(shè)置里面默認(rèn)的就是atomic,意思就是setter/getter函數(shù)是一個原子操作伐弹,如果多線程同時調(diào)用setter時拉馋,不會出現(xiàn)某一個線程執(zhí)行完setter所有語句之前榨为,另一個線程就開始執(zhí)行setter,相當(dāng)于函數(shù)頭尾加了鎖. 這樣的話并發(fā)訪問性能會比較低.

nonatomic: 非原子操作 一般不需要多線程支持的時候就用它煌茴,這樣在并發(fā)訪問的時候效率會比較高. 在objective-c里面通常對象類型都應(yīng)該聲明為非原子性的. iOS中程序啟動的時候系統(tǒng)只會自動生成一個單一的主線程.程序在執(zhí)行的時候一般情況下是在同一個線程里面對一個屬性進(jìn)行操作. 如果在程序中我們確定某一個屬性會在多線程中被使用随闺,并且需要做數(shù)據(jù)同步,就必須設(shè)置成原子性的蔓腐,但也可以設(shè)置成非原子性的矩乐,然后自己在程序中用加鎖之類的來做數(shù)據(jù)同步.通常說nonatomic 是提高在非多線程應(yīng)用中的讀寫效率.

注意,如果不加此屬性回论,則默認(rèn)是兩個訪問方法都為原子型事務(wù)訪問散罕。鎖被加到所屬對象實(shí)例級。

加了atomic傀蓉,setter函數(shù)會變成下面這樣:
if (property != newValue)
{
[property release];
property = [newValue retain];
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末欧漱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子葬燎,更是在濱河造成了極大的恐慌误甚,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谱净,死亡現(xiàn)場離奇詭異窑邦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)壕探,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門冈钦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人浩蓉,你說我怎么就攤上這事派继。” “怎么了捻艳?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長庆猫。 經(jīng)常有香客問我认轨,道長,這世上最難降的妖魔是什么月培? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任嘁字,我火速辦了婚禮,結(jié)果婚禮上杉畜,老公的妹妹穿的比我還像新娘纪蜒。我一直安慰自己,他們只是感情好此叠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布纯续。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪猬错。 梳的紋絲不亂的頭發(fā)上窗看,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機(jī)與錄音倦炒,去河邊找鬼显沈。 笑死,一個胖子當(dāng)著我的面吹牛逢唤,可吹牛的內(nèi)容都是我干的拉讯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鳖藕,長吁一口氣:“原來是場噩夢啊……” “哼魔慷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吊奢,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤盖彭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后页滚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體召边,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年裹驰,在試婚紗的時候發(fā)現(xiàn)自己被綠了隧熙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡幻林,死狀恐怖贞盯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沪饺,我是刑警寧澤躏敢,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站整葡,受9級特大地震影響件余,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜遭居,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一啼器、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧俱萍,春花似錦端壳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岖免。三九已至,卻和暖如春成翩,著一層夾襖步出監(jiān)牢的瞬間觅捆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工麻敌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留栅炒,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓术羔,卻偏偏與公主長得像赢赊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子级历,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評論 2 354

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