1.怎么保證多人開發(fā)進(jìn)行內(nèi)存泄漏的檢查
- 使用Analyze進(jìn)行代碼的靜態(tài)分析
- 為避免不必要的麻煩你辣,多人開發(fā)使用ARC
2.非自動內(nèi)存管理情況下怎么做單例模式
- 聲明一個單例對象的靜態(tài)實例,并初始化為nil
- 創(chuàng)建一個類的類工廠方法戏自,當(dāng)且僅當(dāng)這個類的實例為nil時生成該類的實例
- 實現(xiàn)NSCopying協(xié)議降允,覆蓋alloWithZone:方法,確保用戶在直接分配和初始化對象時,不會產(chǎn)生另一個對象
- 覆蓋release膜赃、autorelease、retain揉忘、retainCount方法跳座,以此確保單例的狀態(tài)
- 在多線程的環(huán)境中,注意使用@synchronized關(guān)鍵字或GCD泣矛,確保靜態(tài)實例被正確的創(chuàng)建的初始化
3.對于類方法(靜態(tài)方法)默認(rèn)是autorelease的疲眷,所有類方法都會是這樣嗎?
NSArray *array = [[[NSArray alloc] init] autorelease];
NSArray *array = [NSArray array];
- 系統(tǒng)自帶的絕大多數(shù)類方法返回的對象您朽,都是經(jīng)過autorelease的
4.block在ARC和MRC中的用法有什么區(qū)別狂丝,需要注意什么?
clang -rewrite-objc main.m
block是指向結(jié)構(gòu)體的指針
編譯器會將block的內(nèi)部代碼生成對應(yīng)的函數(shù)
_block static 是地址傳遞
-
默認(rèn)情況下哗总,block的內(nèi)存是在棧中
- 它不會對引用的對象進(jìn)行任何操作
-
如果對block做一次copy操作几颜,block的內(nèi)存就會在堆中
- 它會對所引用的對象做一次retain操作。
- 非ARC:如果所引用對象用__block修飾讯屈,就不會做retain操作
- ARC:如果所引用對象用了__unsafe_unretained或_weak修飾蛋哭,就不會做retain操作
對于沒有引用外部變量的block,無論在ARC還是非ARC下涮母,類型都是NSGlobalBlock谆趾,這種類型的block可以理解成一種全局的block躁愿,不需要考慮作用域的問題。同時沪蓬,對她進(jìn)行copy或者retain操作是無效的
應(yīng)該避免循環(huán)引用
避免循環(huán)引用
- (instancetype)init
{
if (self = [super init]) {
__block typeof(self) dog = self;//更專業(yè)
// __block Dog *dog = self;
self.block = ^{
[dog run];
}
}
return self;
}
5.什么情況下回發(fā)生內(nèi)存泄漏和內(nèi)存溢出彤钟?
- 當(dāng)程序在申請內(nèi)存后,無法釋放已申請的內(nèi)存空間(例如一個對象或者變量使用完成后沒有釋放怜跑,這個對象一直占用著內(nèi)存)样勃,一次內(nèi)存泄漏危害可以忽略,但內(nèi)存泄漏堆積后果很嚴(yán)重后果很嚴(yán)重性芬,無論多少內(nèi)存峡眶,遲早會被占光。內(nèi)存泄漏最終會導(dǎo)致內(nèi)存溢出
- 當(dāng)程序在申請內(nèi)幕才能時植锉,沒有足夠的內(nèi)存空間供其使用辫樱,出現(xiàn)out of memory;比如申請一個int俊庇,但給它存了long才能存下的數(shù)狮暑,那就是內(nèi)存溢出
6.[NSArray arrayWithObject:(nonnull id)]這個方法添加對象后,需要對這個數(shù)組被釋放操作嗎辉饱?
- 不需要搬男,這個對象被放到自動釋放池中
7. JSON數(shù)據(jù)的解析,和解析數(shù)據(jù)時有內(nèi)存泄漏嗎彭沼?有的話缔逛,如何解決?
1>JSON解析的方案
- NSJSONSerialization
- JSONKit
- SBJSON
2>內(nèi)存有泄漏嗎姓惑?
8.自動釋放池底層怎么實現(xiàn)
- 自動釋放池以棧的形式實現(xiàn):當(dāng)你創(chuàng)建一個新的自動釋放池時褐奴,它將被添加到棧頂。當(dāng)一個對象收到發(fā)送autorelease消息時于毙,它被添加到當(dāng)前線程的處于棧頂?shù)淖詣俞尫懦刂卸囟?dāng)自動釋放池被回收時,它們從棧頂被刪除唯沮,并且會給池子里面所有的隨想都會做一次release操作
非ARC內(nèi)存管理原則
- 1.如果調(diào)用了alloc脖旱、new、copy產(chǎn)生一個新對象介蛉,最后肯定要調(diào)用一次release
- 2.如果讓一個對象做了retain操作(計數(shù)器加1)夯缺,最后肯定要調(diào)用1次release或者autorelease
- 3.原則:有加有減
- retain相當(dāng)于strong
- assign相當(dāng)于weak