Objective-c內(nèi)存管理-筆記

內(nèi)存管理

內(nèi)存管理原則

  • 自己生成的對(duì)象自己持有
    alloc产阱、new、copy捞奕、mutable以及符合以這些關(guān)鍵字為前綴并且符合駝峰拼寫(xiě)法命名的都是自己生成并持有的

  • 非自己生成的對(duì)象自己也能持有
    除alloc、new、copy雏胃、mutableCopy等去得的對(duì)象都為非自己生成但自己持有,我們也有義務(wù)對(duì)其進(jìn)行釋放如果在MRC中

  • 不再需要自己持有的對(duì)象時(shí)釋放
    自己持有的對(duì)象需要釋放志鞍,但如果僅僅是對(duì)象存在但不持有瞭亮,則不需要自己釋放對(duì)象,例如取得注冊(cè)到Autorelease表中的對(duì)象則不需要我們釋放

  • 非自己持有的對(duì)象無(wú)法釋放
    如果過(guò)度釋放會(huì)因?yàn)獒尫帕朔亲约撼钟械膶?duì)象而引起崩潰固棚,如果釋放取得的對(duì)象存在但自己不持有统翩,也會(huì)崩潰仙蚜。

內(nèi)存管理實(shí)現(xiàn)

  • alloc\retain\release\delloc
    猜測(cè)蘋(píng)果的引用計(jì)數(shù)是通過(guò)散列表來(lái)管理引用計(jì)數(shù)的,主要通過(guò)CFDoExternRefOperation來(lái)進(jìn)行分發(fā)操作的厂汗,大概步驟是先通過(guò)函數(shù)找到散列表Table委粉,然后根據(jù)retainCount/retain/release等進(jìn)行分發(fā)操作來(lái)記錄引用計(jì)數(shù)

  • autorelease
    其實(shí)跟C語(yǔ)言中得局部變量類似,超出作用域則自動(dòng)廢棄娶桦。其生命周期可以看做:生成并持有NSAutoreleasePool對(duì)象-調(diào)用已分配對(duì)象的autorelease方法-廢棄NSautoreleasePool(這里被分配的對(duì)象也會(huì)自動(dòng)調(diào)用release進(jìn)行釋放)贾节,NSRunLoop每次循環(huán)時(shí)都會(huì)將廢棄的NSAutoreleasePool進(jìn)行處理,大量讀取圖像并進(jìn)行操作的時(shí)候最好每個(gè)都放在AutoreleasePool中進(jìn)行不然會(huì)產(chǎn)生大量autorelease衷畦,造成內(nèi)存不足栗涂。其實(shí)現(xiàn)可看做 :push到Pool中--autorelease 將對(duì)象加到autoreleasepool池中--pop 相對(duì)于廢棄NSAutoreleasePool對(duì)象

ARC規(guī)則

所有權(quán)修飾符

  • strong 修飾符
    oc中的對(duì)象默認(rèn)修飾符都是strong類型,通過(guò)strong修飾無(wú)需再retain或者release

  • weak修飾符
    weak的出現(xiàn)是為了解決循環(huán)引用而引起的內(nèi)存泄露祈争,他是弱引用不持有對(duì)象斤程,而且他會(huì)自動(dòng)置為nil,

  • unsafe_unretained修飾符
    是不安全的修飾符菩混,他不屬于編譯器的內(nèi)存管理對(duì)象忿墅,因此使用它得非常小心,容易造成垂懸指針墨吓,所以使用它時(shí)一定要保證他的對(duì)象存在

  • autorelease修飾符
    被autorelease修飾的對(duì)象會(huì)被注冊(cè)到autoreasePool池中球匕,保證其對(duì)象存在 但不被持有,一般除了alloc/new/copy/mutableCopy以及符合駝峰命名法生成的對(duì)象都是注冊(cè)到autorelease中帖烘,而且weak修飾的對(duì)象也會(huì)被注冊(cè)到autorelease中亮曹,而且id的指針都是默認(rèn)被autorelease修飾,

規(guī)則

  • 不能使用retain/release/autorealse/dealloc/retainCount/autorelease
  • 不能使用NSAllocateObject和NSDeallocateObject
  • 須遵循內(nèi)存管理的命名法則
  • 使用@autorelease{}代替NSAutoreleasePool
  • 不能使用區(qū)域NSZone
  • 對(duì)象變量不能作為C語(yǔ)言的結(jié)構(gòu)體的的成員 需加unsafe_unretained修飾符
  • 顯示轉(zhuǎn)換”id“ 和”void *“ 通過(guò)bridge(bridge_retained和bridge_transfer) 可以進(jìn)行互換

ARC實(shí)現(xiàn)

  • strong修飾符
    在運(yùn)行時(shí)自動(dòng)給我上了release
 NSObject *obj = [[NSObject alloc] init];

id obj = objc_msgSend(NSObject,@selector(alloc));

objc_msgSend(obj,@selector(init));

objc_release(obj);

NSAarray *arr = [NSArray array];
 +(id)array{

return [[NSArray alloc] init];
 }
id obj = objc_msgSend(NSArray,@selector(init));
objc_retainAutoreleaseReturnValue(obj);
objc_release(obj);

id obj = objc_msgSend(NSArray,@selector(alloc));
objc_msgSend(obj,@selector(init));
return objc_autoreleaseReturnValue(obj);

objc_autoreleaseReturnValue 和 objc_retainautoreleasedReturnValue成對(duì)出現(xiàn),不需要注冊(cè)到autoreleasepool中秘症,而直接進(jìn)行傳遞保證對(duì)象的存在照卦,這一過(guò)程達(dá)到了最優(yōu)化

  • weak修飾符
{
id obj1 = obj;
}

id obj1;
objc_initWeak(&obj1,obj);
objc_destoryWeak(&obj1,0);

通過(guò)objc_initWeak函數(shù)初始化weak 修飾的變量,在變量作用域結(jié)束時(shí)調(diào)用objc_destoryWeak函數(shù)釋放該變量乡摹。其中objc_storeWeak(&obj1,obj)處理役耕,如果obj超出了作用域objc_storeWeak(&obj1,0),然后把變量的地址從weak表中移除聪廉,NSMachPort不支持weak

  • autorelease修飾符
id pool = objc_autoreleasePoolPush();
id obj = objc_msgSend(NSObject,@selector(alloc));
objc_msdSend(obj,@selector(init));
objc_autorelease(obj);
objc_autoreleasePoolPop(pool);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瞬痘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子板熊,更是在濱河造成了極大的恐慌框全,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件干签,死亡現(xiàn)場(chǎng)離奇詭異津辩,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門喘沿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)闸度,“玉大人,你說(shuō)我怎么就攤上這事蚜印≥航” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵晒哄,是天一觀的道長(zhǎng)睁宰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)寝凌,這世上最難降的妖魔是什么柒傻? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮较木,結(jié)果婚禮上红符,老公的妹妹穿的比我還像新娘。我一直安慰自己伐债,他們只是感情好预侯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著峰锁,像睡著了一般萎馅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上虹蒋,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天糜芳,我揣著相機(jī)與錄音,去河邊找鬼魄衅。 笑死峭竣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晃虫。 我是一名探鬼主播皆撩,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼哲银!你這毒婦竟也來(lái)了扛吞?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤荆责,失蹤者是張志新(化名)和其女友劉穎喻粹,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體草巡,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了山憨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片查乒。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖郁竟,靈堂內(nèi)的尸體忽然破棺而出玛迄,到底是詐尸還是另有隱情,我是刑警寧澤棚亩,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布蓖议,位于F島的核電站,受9級(jí)特大地震影響讥蟆,放射性物質(zhì)發(fā)生泄漏勒虾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一瘸彤、第九天 我趴在偏房一處隱蔽的房頂上張望修然。 院中可真熱鬧,春花似錦质况、人聲如沸愕宋。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)中贝。三九已至,卻和暖如春臼朗,著一層夾襖步出監(jiān)牢的瞬間邻寿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工依溯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留老厌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓黎炉,卻偏偏與公主長(zhǎng)得像枝秤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子慷嗜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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