內(nèi)存管理與引用計數(shù)

引用計數(shù)式內(nèi)存管理的思考方式

引用計數(shù)式的內(nèi)存管理方式主要涉及四個操作:生成對象,持有對象宫盔,釋放對象,廢棄對象享完。

  • 內(nèi)存管理的思考方式

    • 自己生成的對象飘言,自己持有
    • 非自己生成的對象,自己也能持有
    • 不再需要自己持有的對象時釋放
    • 非自己持有的對象無法釋放

與oc中方法對應(yīng)如下:

+對象操作                       +Oc方法
生成并持有對象             alloc/new/copy/mutablecopy等方法
持有對象                        retain方法
釋放對象                        release方法
廢棄對象                        dealloc方法
  • 自己生成的對象驼侠,自己持有

使用alloc, new, copy, mutablecopy開頭的方法意味著自己生成的對象自己持有

注:命名要符合駝峰命名法姿鸿。

  • 非自己生成的對象,自己也能持有

通過retain方法倒源,非自己生成的對象也可以持有對象了苛预。

  • 不再需要自己持有的對象時釋放

自己持有的對象,一旦不再需要笋熬,持有者有義務(wù)釋放該對象热某。釋放使用release方法。

使用autorelease方法可以使取得的對象存在胳螟,但是自己不持有對象昔馋。

  • 無法釋放非自己持有的對象

釋放非自己持有的對象會造成程序的崩潰。

GNUSTEP和APPLE中alloc/retain/release/dealloc的實現(xiàn)

在申請內(nèi)存的時候糖耸,會在內(nèi)存頭部之前申請一塊內(nèi)存用來保存引用計數(shù)秘遏。然后分別在不同的操作的時候?qū)@一引用計數(shù)值進行判斷并作相應(yīng)調(diào)整〖尉梗總結(jié)如下:

1.調(diào)用alloc或是retain方法后邦危,引用計數(shù)值加1。
2.調(diào)用release之后舍扰,引用計數(shù)值減1
3.引用計數(shù)值為0時倦蚪,調(diào)用delloc方法廢棄對象

蘋果在實現(xiàn)上述方式時沒有使用內(nèi)存頭部管理引用計數(shù),而是使用采用了散列表管理引用計數(shù)

autorelease

自動釋放--autorelease

aurorelease就是自動釋放边苹,類似于c語言中的自動變量陵且。

autorelease的具體使用方法:

1,生成并持有NSAutoreleasePool對象
2个束,調(diào)用已分配對象的autorelease實例方法
3慕购,廢棄NSAutoreleasePool對象

在Cocoa框架中,相當于程序主循環(huán)的NSRunloop或者在其他程序可運行的地方播急,對NSAutoreleasePool對象進行生成脓钾,持有和廢棄處理。

ARC規(guī)則

所有權(quán)修飾符:

  • _strong修飾符
  • _weak修飾符
  • _unsafe_unretained修飾符
  • _autoreleasing修飾符

_strong修飾符

_strong修飾符是id類型和對象類型默認的所有權(quán)修飾符桩警。附有_strong修飾符的變量在超出其變量作用域時可训,釋放其被賦予的對象。_strong修飾符表示對對象的“強引用”捶枢,持有強引用的變量在超出其作用域時被放棄握截,隨著強引用的失效,引用的對象會隨之釋放烂叔。通過_strong修飾符谨胞,不必再次鍵入retain或者release,就完美的滿足了“引用計數(shù)式內(nèi)存管理的思考方式”蒜鸡。

注:id類型和對象類型的所有權(quán)修飾符默認為_strong修飾符胯努。

_weak修飾符

如果僅使用_strong修飾符會造成“循環(huán)引用”的問題牢裳,這個時候就用到了_weak。帶有_weak修飾符的變量不持有對象叶沛,所以在超出其變量作用域時蒲讯,對象即被釋放。_weak的另一個優(yōu)點是灰署,在持有某對象的弱引用時判帮,若該對象被釋放,則此弱引用將自動失效且處于nil被賦值狀態(tài)溉箕。

_unsafe_unretained修飾符

在ios5以下版本中無法使用_weak晦墙,所以_unsafe_unretained成為替代品。但是_unsafe_unretained不保證最后的對象被釋放肴茄,且處于nil被賦值狀態(tài)晌畅。所以賦值給附有_unsafe_unretained修飾符變量的對象在使用時,要確保它存在独郎。

_autoreleasing修飾符

在ARC有效時踩麦,用“@autoreleasepool塊”來代替“NSAutoreleasePool”。

編譯器會檢查方法名是否以alloc/new/copy/mutableCopy開始氓癌,如果不是則自動將返回值的對象注冊到autoreleasepool(注:init返回值的對象不注冊到autoreleasepool)谓谦。在使用附有_weak修飾符的變量時必須訪問注冊到autoreleasepool的對象,因為_weak修飾符持有對象的弱引用贪婉,在訪問引用對象的過程中反粥,該對象可能被丟棄,所以把要訪問的對象注冊到autoreleasepool中疲迂,那么在@autoreleasepool結(jié)束之前多能確保該對象存在才顿。

屬性

      屬性聲明的屬性                       所有權(quán)修飾符
        assign                          _unsafe_unretained
        copy                            _strong
        retain                          _strong
        strong                          _strong
        unsafe_unretained               _unsafe_unretained
        weak                            _weak

其中:
assign:一般基本變量用該屬性聲明,eg:int BOOL

copy:聲明的變量是拷貝賦值源所生成的對象

retain和strong表示意思相同

strong:屬性所聲明的變量將成為對象的持有者

unsafe_unretained:ios5之前的系統(tǒng)用該屬性代替weak

關(guān)于ARC認識很好的博文,一個系列尤蒿,值得一讀郑气。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市腰池,隨后出現(xiàn)的幾起案子尾组,更是在濱河造成了極大的恐慌,老刑警劉巖示弓,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讳侨,死亡現(xiàn)場離奇詭異,居然都是意外死亡奏属,警方通過查閱死者的電腦和手機跨跨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來囱皿,“玉大人勇婴,你說我怎么就攤上這事忱嘹。” “怎么了耕渴?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵德谅,是天一觀的道長。 經(jīng)常有香客問我萨螺,道長,這世上最難降的妖魔是什么愧驱? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任慰技,我火速辦了婚禮,結(jié)果婚禮上组砚,老公的妹妹穿的比我還像新娘吻商。我一直安慰自己,他們只是感情好糟红,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布艾帐。 她就那樣靜靜地躺著,像睡著了一般盆偿。 火紅的嫁衣襯著肌膚如雪柒爸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天事扭,我揣著相機與錄音捎稚,去河邊找鬼。 笑死求橄,一個胖子當著我的面吹牛今野,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播罐农,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼条霜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了涵亏?” 一聲冷哼從身側(cè)響起宰睡,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎溯乒,沒想到半個月后夹厌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡裆悄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年矛纹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片光稼。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡或南,死狀恐怖孩等,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情采够,我是刑警寧澤肄方,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蹬癌,受9級特大地震影響权她,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逝薪,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一隅要、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧董济,春花似錦步清、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至封豪,卻和暖如春谴轮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撑毛。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工书聚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人藻雌。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓雌续,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胯杭。 傳聞我的和親對象是個殘疾皇子驯杜,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

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