OC引用計數(shù)

C與OC的比較


在C語言中褐望,只存在內(nèi)存地址的分配和釋放勒庄。同一個內(nèi)存地址可以被多個指針指向。

int number = 4; // 定義一個數(shù)字

int *a = malloc(8); // 從堆區(qū)分配空間

*a = number; // 是指針a指向number

int *b = a; // 將指針a的值賦給指針b

free(b); // 釋放指針b

在上述代碼中瘫里,指針a和b指向的是一個同一個內(nèi)存地址实蔽,由指針a來開辟內(nèi)存空間,最后通過b來釋放內(nèi)存空間谨读。實際上這兩個指針是完全一模一樣的局装,即a = b。對a和b做操作劳殖,相當于是對他們指向的內(nèi)存空間做操作铐尚。

但是這樣會產(chǎn)生一個問題,在指針b被釋放之后哆姻,如同上面說的宣增,指針b被釋放,實際上是指針b指向的內(nèi)存空間被釋放掉了矛缨,也就是說爹脾,指針a指向的內(nèi)存空間也不存在了。如果我們使用指針a這個變量箕昭,就會報野指針錯誤灵妨。

為了改善這一方面,OC就有了引用計數(shù)機制:

NSObject *a = [[NSObject alloc] init]; // 在堆區(qū)分配內(nèi)存空間落竹,引用計數(shù)為1

NSObject *b = [a retain]; // 對象b通過retain持有對象a泌霍,引用計數(shù)+1

[a release]; // 釋放對象a,引用計數(shù)-1

NSLog(@"a: %@, b: %@", a, b); // a和b都可以使用

[b release]; // 釋放對象b // 引用計數(shù)-1述召,引用計數(shù)變?yōu)?

NSLog(@"a: %@, b: %@", a, b); // a和b被真正釋放了

在上述代碼中朱转,效果是和C語言是一樣的,對象a和對象b是完全相等的积暖,他們也是指向相同的內(nèi)存地址肋拔。但OC代碼中使用alloc來分配空間,retain用來持有對象呀酸,通過release來釋放對象(在OC中凉蜂,是不允許直接將對象釋放的,當引用計數(shù)為0的時候,dealloc方法系統(tǒng)會自動調(diào)用)窿吩。這里的release實際上的效果是對這片內(nèi)存地址上的引用計數(shù)-1茎杂,代表的意思雖然是釋放該對象,但其實在該內(nèi)存地址的引用計數(shù)不為o的時候纫雁,我們還可以繼續(xù)使用它煌往,這種做法只是在編譯上告知我們該對象已經(jīng)被釋放,當引用計數(shù)變?yōu)?的時候該片內(nèi)存地址就會被徹底釋放轧邪。就是一個對象創(chuàng)建了就一定會被釋放刽脖,當所有持有該內(nèi)存地址的對象被釋放了,該內(nèi)存地址才會被真正的釋放忌愚。

OC內(nèi)存管理上要注意的就是引用計數(shù)實際上是對內(nèi)存地址的持有者的一個計數(shù)曲管,而不是對象本身。創(chuàng)建對象的時候一定要使用alloc硕糊,retain院水,new,copy等關(guān)鍵詞來創(chuàng)建简十,而不能直接賦值(其實直接賦值也是可以的檬某,但該對象不能被釋放,只要以后不再使用這個對象就好了螟蝙。為了更加的安全恢恼,還是規(guī)范的寫更好一些)。釋放對象的方式有兩種:release和autorelease胰默。它們的含義是釋放了這個對象厅瞎,實際作用都是給引用計數(shù)-1,而不是去釋放內(nèi)存地址初坠。所以當釋放了這個對象之后,如果還有其他對象持有該內(nèi)存地址彭雾,就可以繼續(xù)使用該對象碟刺,但是為了安全起見,當對象不在使用的時候?qū)⑵溽尫攀碓停尫胖蟛灰偃ナ褂冕尫藕蟮膶ο蟀牍痢H绻搶ο笫俏ㄒ坏某钟姓撸蜁鹨爸羔槨?/p>

我們來看一下下面的代碼:

int number = 4;

int *a = malloc(8);

a = &number;

free(a);

在上面的代碼中吴菠,我們可以看到指針a分配了8個字節(jié)的地址者填,但是后來將a又指向了number的地址,最后釋放a做葵。這樣釋放的其實釋放的是number的地址占哟,而number是在棧區(qū)中的,不能被手動釋放,而原來的內(nèi)存地址現(xiàn)在由于沒有指向而無法得到釋放榨乎。這樣就造成了內(nèi)存泄漏怎燥。

在OC中也會有這樣的情況:

NSLog(@"%@", [[NSObject alloc] init]);

NSLog(@"%@", [[[NSObject alloc] init] autorelease]);

類似于C語言一樣的內(nèi)存泄漏我們就不說了,我們來講一講對象作為參數(shù)的時候蜜暑。比較上面兩行代碼铐姚,都打印了一下NSObject的一個實例,這個實例是作為參數(shù)而被創(chuàng)建的肛捍,該片內(nèi)存地址沒有任何持有者隐绵,但是內(nèi)存空間確實是被開辟出來了。對于這樣的情況我們不可以使用release來立即釋放拙毫,通過持有對象依许,調(diào)用對象,釋放對象流程就太過繁瑣了恬偷,所以這里可以使用autorelease關(guān)鍵詞來自動釋放對象悍手,這樣在該對象被使用完后,該對象會被自動釋放袍患。便利構(gòu)造器就是在這樣的情況下使用的坦康。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市诡延,隨后出現(xiàn)的幾起案子滞欠,更是在濱河造成了極大的恐慌,老刑警劉巖肆良,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筛璧,死亡現(xiàn)場離奇詭異,居然都是意外死亡惹恃,警方通過查閱死者的電腦和手機夭谤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巫糙,“玉大人朗儒,你說我怎么就攤上這事〔窝停” “怎么了醉锄?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浙值。 經(jīng)常有香客問我恳不,道長,這世上最難降的妖魔是什么开呐? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任烟勋,我火速辦了婚禮规求,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘神妹。我一直安慰自己颓哮,他們只是感情好,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布鸵荠。 她就那樣靜靜地躺著冕茅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛹找。 梳的紋絲不亂的頭發(fā)上姨伤,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機與錄音庸疾,去河邊找鬼乍楚。 笑死,一個胖子當著我的面吹牛届慈,可吹牛的內(nèi)容都是我干的徒溪。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼金顿,長吁一口氣:“原來是場噩夢啊……” “哼臊泌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起揍拆,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤渠概,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嫂拴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體播揪,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年筒狠,在試婚紗的時候發(fā)現(xiàn)自己被綠了猪狈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡辩恼,死狀恐怖雇庙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情运挫,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布套耕,位于F島的核電站谁帕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏冯袍。R本人自食惡果不足惜匈挖,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一碾牌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧儡循,春花似錦舶吗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肴捉,卻和暖如春腹侣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背齿穗。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工傲隶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窃页。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓跺株,卻偏偏與公主長得像,于是被迫代替她去往敵國和親脖卖。 傳聞我的和親對象是個殘疾皇子乒省,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

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

  • 1.1 什么是自動引用計數(shù) 概念:在 LLVM 編譯器中設(shè)置 ARC(Automaitc Reference Co...
    __silhouette閱讀 5,120評論 1 17
  • 307作儿、setValue:forKey和setObject:forKey的區(qū)別是什么? 答:1, setObjec...
    AlanGe閱讀 1,534評論 0 1
  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛DE問候閱讀 1,712評論 0 4
  • 直接拿xcode 實踐對比打印出來retaincount 來看看引用計數(shù)到底怎樣增加和減少的 首先在Xcode里面...
    三三哥閱讀 578評論 0 0
  • 內(nèi)存管理 簡述OC中內(nèi)存管理機制馋劈。與retain配對使用的方法是dealloc還是release攻锰,為什么?需要與a...
    丶逐漸閱讀 1,958評論 1 16