怎么保證多人開發(fā)進(jìn)行內(nèi)存泄露的檢查术陶?
使用Analyze進(jìn)行代碼的靜態(tài)分析磕瓷。
盡量使用ARC環(huán)境開發(fā)膘螟。
非自動(dòng)內(nèi)存管理情況下怎么做單例模式笙僚?
聲明一個(gè)單例對(duì)象的靜態(tài)實(shí)例芳肌,并初始化為nil。
創(chuàng)建一個(gè)類工廠方法,當(dāng)且僅當(dāng)這個(gè)類的實(shí)例為nil時(shí)生成一個(gè)該類的實(shí)例亿笤。
實(shí)現(xiàn)NSCopying協(xié)議翎迁,覆蓋allocWithZone方法,確保用戶在直接分配和初始化對(duì)象時(shí)责嚷,不會(huì)產(chǎn)生另一個(gè)對(duì)象鸳兽。
覆蓋release 、autorelease罕拂、retain揍异、reatinCount方法,以此確保單例的狀態(tài)爆班。
聲明一個(gè)單例對(duì)象的靜態(tài)實(shí)例衷掷,并初始化為nil。
static Singleton * sharedSingleton = nil;
創(chuàng)建一個(gè)類工廠方法柿菩,當(dāng)且僅當(dāng)這個(gè)類的實(shí)例為nil時(shí)生成一個(gè)該類的實(shí)例戚嗅。
- (Singleton *) sharedInstance
{
if (sharedSingleton == nil) {
sharedSingleton = [[super allocWithZone:NULL] init];
}
return sharedSingleton;
}
實(shí)現(xiàn)NSCopying協(xié)議,覆蓋allocWithZone方法枢舶,確保用戶在直接分配和初始化對(duì)象時(shí)懦胞,不會(huì)產(chǎn)生另一個(gè)對(duì)象 - (id) allocWithZone:(struct _NSZone *)zone
{
return [[self sharedInstance] retain];
}
(id) copyWithZone:(NSZone *) zone
{
return self;
}
覆蓋release 、autorelease凉泄、retain躏尉、reatinCount方法,以此確保單例的狀態(tài)后众。(id) retain
{
return self;
}(NSUInteger) retainCount
{
return NSUIntegerMax;
}
在多線程的環(huán)境中胀糜,注意使用@synchronized關(guān)鍵字或GCD,確保靜態(tài)實(shí)例被正確的創(chuàng)建和初始化蒂誉。
對(duì)于類方法默認(rèn)是autorelease的教藻,所有方法都會(huì)這樣嗎?
系統(tǒng)自帶的絕大多數(shù)類方法返回的對(duì)象右锨,都是經(jīng)過autrolease的括堤。
block在ARC和MRC中的用法區(qū)別,需要注意什么問題陡蝇?
對(duì)于沒有使用外部變量的block痊臭,不管是在ARC還是MRC下,都是NSGlobalBlock登夫,這種類型的block可以理解為一種全局的block广匙。不需要考慮作用率問題。同時(shí)恼策,對(duì)他進(jìn)行Copy或者Retain操作也是無效的鸦致。
循環(huán)引用問題潮剪。
什么情況下會(huì)發(fā)生內(nèi)存泄露和內(nèi)存溢出?
當(dāng)程序在申請(qǐng)內(nèi)存后分唾,無法釋放已申請(qǐng)的內(nèi)存空間抗碰,一次內(nèi)存泄露危害可以忽略,但內(nèi)存泄露堆積的多了绽乔,就會(huì)導(dǎo)致內(nèi)存溢出弧蝇。
當(dāng)程序在申請(qǐng)內(nèi)存時(shí),沒有足夠的內(nèi)存空間供其使用折砸,出現(xiàn)out of memory看疗。
自動(dòng)釋放池的底層實(shí)現(xiàn)?
自動(dòng)釋放池以棧的形式實(shí)現(xiàn)睦授。當(dāng)創(chuàng)建一個(gè)新的自動(dòng)釋放池時(shí)两芳,它將被添加到棧頂。當(dāng)一個(gè)對(duì)象收到發(fā)送autorelease消息時(shí)去枷,它被添加到當(dāng)前線程的處于棧頂?shù)淖詣?dòng)釋放池中怖辆,當(dāng)自動(dòng)釋放池被回收后,他們從棧中被刪除删顶,并且會(huì)給池中里面所有的對(duì)象都會(huì)做一次realease操作竖螃。
?