【iOS】?jī)?nèi)存管理

  • MRC:manual reference counting 手動(dòng)內(nèi)存管理
  • ARC:automatic reference counting 自動(dòng)內(nèi)存管理

MRC管理內(nèi)存

1、基本概念

MRC:手動(dòng)內(nèi)存管理

alloc、retain、copy、new 會(huì)造成引用計(jì)數(shù)加1 ;與release 成對(duì)出現(xiàn)

內(nèi)存的擁有者:造成引用計(jì)數(shù)加1的對(duì)象

誰(shuí)擁有,誰(shuí)釋放

2、局部、全局變量

局部變量:出作用域之前,要記得release

全局變量:在dealloc方法中release

dealloc方法:是當(dāng)前類的引用計(jì)數(shù)為 0 的時(shí)候,會(huì)調(diào)用的方法

[super dealloc]是dealloc方法的最后一句代碼

3、靜態(tài)方法

局部變量:不需要進(jìn)行內(nèi)存管理;

全局變量:需要retain;在dealloc方法中release;

4、賦新值之前,釋放舊值

1)對(duì)象類型:(除了 NSString、delegate )retain
2)NSString:copy
3)基本類型、delegate :assign

delegate:采用關(guān)鍵字 assign是為了避免 循環(huán)引用

定時(shí)器、字符串 不符合內(nèi)存管理

ARC管理內(nèi)存

  • 如果在ARC工程中,使用了非ARC(MRC)文件,需要添加 -fno-objc-arc 標(biāo)簽
  • 如果在非ARC工程中,使用了ARC的文件,需要添加 -fobjc-arc 標(biāo)簽

ARC 編譯器的特性:編譯器在 編譯時(shí) ,會(huì)在合適的位置添加上 retain 、release 等操作

( ps:GC (java語(yǔ)言中)garbage collection 垃圾回收機(jī)制 運(yùn)行時(shí)

  • strong強(qiáng)引用:強(qiáng)引用指向的對(duì)象,會(huì)保留對(duì)象的所有權(quán),對(duì)象不會(huì)馬上釋放,如果對(duì)象沒(méi)有strong類型的強(qiáng)引用指針時(shí),對(duì)象馬上就會(huì)被釋放掉

  • weak弱引用:弱引用指向的對(duì)象如果被釋放了,指針會(huì)置為空 nil

  • 當(dāng)創(chuàng)建的變量沒(méi)有關(guān)鍵字 默認(rèn)是strong

  • -(void)dealloc

    • 對(duì)象將要釋放,但在 未釋放之前 執(zhí)行dealloc方法

    • 在ARC中dealloc方法還會(huì)執(zhí)行,但不需要寫(xiě)[super dealloc]語(yǔ)句
      可以在dealloc方法中移除通知、移除KVO

  • 局部變量:在當(dāng)前方法執(zhí)行完畢時(shí),對(duì)象會(huì)被釋放

  • 全局變量:當(dāng)前視圖控制器釋放,會(huì)被釋放,或者它的指針置為空nil

  • 基本類型(int...): 一般使用 unsafe_unretained 編譯時(shí),會(huì)將 assign 改成 unsafe_unretained

  • 非基本類型的變量一般使用 strong
    retain 在編譯時(shí),會(huì)將retain改成為strong

  • copy和MRC中的使用一致

  • weak:outlet 中一般使用 weak (父視圖會(huì)對(duì)此控件強(qiáng)引用)

  • 循環(huán)引用:把其中一個(gè)strong類型的指針改成weak

  • autorelease 在ARC中可以使用:__autoreleasing

  • NSAutoreleasePool 自動(dòng)釋放池(MRC中使用)

  • 在局部創(chuàng)建大量對(duì)象,需要把對(duì)象放入到自動(dòng)釋放池中 ( ARC中)
    @autoreleasepool
    {

    }

C 語(yǔ)言的處理

ARC 只負(fù)責(zé) OC

void * (c語(yǔ)言中的任意類型)

從OC類型轉(zhuǎn)換成 c語(yǔ)言類型

  • __bridge 關(guān)鍵字 可以在oc與c之間相互轉(zhuǎn)換

  • __bridge 只是做了一個(gè)類型轉(zhuǎn)換,與內(nèi)存管理無(wú)關(guān)

  1. __bridge 可以在oc和c之間任意轉(zhuǎn)換,與內(nèi)存管理無(wú)關(guān)
  2. __bridge_retained oc ===> c 轉(zhuǎn)換了對(duì)象 的所有權(quán) 需要使用CFRetain 、CFRelease來(lái)管理內(nèi)存
  3. __bridge_transfer c ===> oc 轉(zhuǎn)換了對(duì)象的所有權(quán)

copy的處理

  • 深復(fù)制:對(duì)象復(fù)制 返回新的對(duì)象
  • 淺復(fù)制:指針復(fù)制 返回的是復(fù)制的指針

NSString 能使用copy 關(guān)鍵字,實(shí)現(xiàn)了NSCopying 協(xié)議
只有實(shí)現(xiàn)了 NSCopying協(xié)議 和 NSMutableCopying協(xié)議的對(duì)象才能使用 copy和mutableCopy 關(guān)鍵字

copy : 返回的是不可變對(duì)象
mutableCopy : 返回的是可變對(duì)象

對(duì)于 NSString copy 就是淺 copy 只是復(fù)制了指針 (指針指向的是同一個(gè)對(duì)象)
對(duì)于NSMutableString 無(wú)論是copy 還是mutableCopy 都是深copy ,copy了對(duì)象(創(chuàng)建了新的對(duì)象)

深copy又分為:

  • 不完全copy :只把對(duì)象copy了一份,屬性沒(méi)有copy
  • 完全copy:把對(duì)象copy了一份,并且把對(duì)象中的所有屬性都copy一份

微信公共號(hào):iapp666666
GitHub:點(diǎn)此前往

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Copyright ? 2017年ZaneWangWang. All rights reserved. 如果你看到...
    2897275c8a00閱讀 973評(píng)論 0 1
  • 終于明白那些年知其然而不知其所以然的iOS內(nèi)存管理方式 前言 從我開(kāi)始學(xué)習(xí)iOS的時(shí)候,身邊的朋友、網(wǎng)上的博客都告...
    楓宇翔閱讀 7,412評(píng)論 8 49
  • 馮·諾依曼體系:運(yùn)算器 控制器 存儲(chǔ)器 輸入與輸出 內(nèi)存即存儲(chǔ)器,用來(lái)存儲(chǔ)指令與數(shù)據(jù) 注:哈佛體系與普林斯頓體系的...
    小李龍彪閱讀 707評(píng)論 0 8
  • 軟件運(yùn)行時(shí)會(huì)分配和使用設(shè)備的內(nèi)存資源,因此,在軟件開(kāi)發(fā)的過(guò)程中,需要進(jìn)行內(nèi)存管理,以保證高效、快速的分配內(nèi)存,并且...
    Mr_Atom閱讀 740評(píng)論 0 2
  • 早安,故鄉(xiāng)。 早安,故鄉(xiāng)的人們。 還有幾天,我就要離開(kāi)這個(gè)生我養(yǎng)我的地方,去往廈門了。 ...
    wengerqw閱讀 275評(píng)論 0 0

友情鏈接更多精彩內(nèi)容