一苍蔬、怎么保證多人開發(fā)進行內(nèi)存泄露的檢查.
- 使用Analyze進行代碼的靜態(tài)分析
- 為避免不必要的麻煩, 多人開發(fā)時盡量使用ARC
二、非自動內(nèi)存管理情況下怎么做單例模式.
創(chuàng)建單例設(shè)計模式的基本步驟 ·
- 聲明一個單件對象的靜態(tài)實例,并初始化為nil特漩。
- 創(chuàng)建一個類的類工廠方法,當且僅當這個類的實例為nil時生成一個該類的實例
- 實現(xiàn)NScopying協(xié)議, 覆蓋allocWithZone:方法,確保用戶在直接分配和初始化對象時,不會產(chǎn) 生另一個對象。
- 覆蓋release匆赃、autorelease师郑、retain、retainCount方法, 以此確保單例的狀態(tài)漫蛔。
- 在多線程的環(huán)境中,注意使用@synchronized關(guān)鍵字或GCD,確保靜態(tài)實例被正確的創(chuàng)建和初始化嗜愈。
三、對于類方法(靜態(tài)方法)默認是 autorelease的莽龟。所有類方法都會這樣嗎蠕嫁?
1> 系統(tǒng)自帶的絕大數(shù)類方法返回的對象,都是經(jīng)過autorelease的
四、block在 ARC中和 MRC中的用法有什么區(qū)別,需要注意什么
1.對于沒有引用外部變量的Block毯盈,無論在ARC還是非ARC下剃毒,類型都是NSGlobalBlock,這種類型的block可以理解成一種全局的block搂赋,不需要考慮作用域問題赘阀。同時,對他進行Copy或者Retain操作也是無效的
2.應(yīng)注意避免循環(huán)引用
五脑奠、什么情況下會發(fā)生內(nèi)存泄漏和內(nèi)存溢出基公?
當程序在申請內(nèi)存后,無法釋放已申請的內(nèi)存空間(例如一個對象或者變量使用完成后沒有釋放,這個對象一直占用著內(nèi)存)宋欺,一次內(nèi)存泄露危害可以忽略轰豆,但內(nèi)存泄露堆積后果很嚴重胰伍,無論多少內(nèi)存,遲早會被占光。內(nèi)存泄露會最終會導(dǎo)致內(nèi)存溢出酸休!當程序在申請內(nèi)存時骂租,沒有足夠的內(nèi)存空間供其使用,出現(xiàn)out of memory斑司;比如申請了一個int,但給它存了long才能存下的數(shù)渗饮,那就是內(nèi)存溢出。
六陡厘、[NSArrayarrayWithobject:<id>] 這個方法添加對象后抽米,需要對這個數(shù)組做釋放操作嗎特占?
不需要糙置,這個對象被放到自動釋放池中
七、Json數(shù)據(jù)的解析?
- JSON解析的方案
1.SBJson
2.JSONkit
3.NSJSONSerialization
八是目、自動釋放池底層怎么實現(xiàn)
自動釋放池以棧的形式實現(xiàn):當你創(chuàng)建一個新的自動釋放池時谤饭,它將被添加到棧頂。當一個對象收到發(fā)送autorelease消息時,它被添加到當前線程的處于棧頂?shù)淖詣俞尫懦刂?當自動釋放池被回收時,它們從棧中被刪除,并且會給池子里面所有的對象都會做一次release操作.
九懊纳、自動釋放池是什么,如何工作
當您向一個對象發(fā)送一個autorelease消息時揉抵,Cocoa就會將該對象的一個引用放入到最新的自動釋放池。它仍然是個正當?shù)膶ο筻头瑁虼俗詣俞尫懦囟x的作用域內(nèi)的其它對象可以向它發(fā)送消息冤今。當程序執(zhí)行到作用域結(jié)束的位置時,自動釋放池就會被釋放茂缚,池中的所有對象也就被釋放戏罢。1.ojc-c是通過一種"referring counting"(引用計數(shù))的方式來管理內(nèi)存的,對象在開始分配內(nèi)存(alloc)的時候引用計數(shù)為一,以后每當碰到有copy,retain的時候引用計數(shù)都會加一,每當碰到release和autorelease的時候引用計數(shù)就會減一,如果此對象的計數(shù)變?yōu)榱?, 就會被系統(tǒng)銷毀.2. NSAutoreleasePool就是用來做引用計數(shù)的管理工作的,這個東西一般不用你管的. 3. autorelease和release沒什么區(qū)別,只是引用計數(shù)減一的時機不同而已,autorelease會在對象的使用真正結(jié)束的時候才做引用計數(shù)減一.
十、Objective-C如何對內(nèi)存管理的,說說你的看法和解決方法?
Objective-C 的內(nèi)存管理主要有三種方式 ARC(自動內(nèi)存計數(shù))脚囊、手動內(nèi)存計數(shù)龟糕、內(nèi)存池。1. (Garbage Collection)自動內(nèi)存計數(shù):這種方式和 java 類似悔耘,在你的程序的執(zhí)行過程中讲岁。始終有一個高人在背后準確地幫你收拾垃圾,你不用考慮它什么時候開始工作衬以,怎樣工作缓艳。你只需要明白,我申請了一段內(nèi)存空間看峻,當我不再使用從而這段內(nèi)存成為垃圾的時候郎任,我就徹底的把它忘記掉,反正那個高人會幫我收拾垃圾备籽。遺憾的是舶治,那個高人需要消耗一定的資源分井,在攜帶設(shè)備里面,資源是緊俏商品所以 iPhone 不支持這個功能霉猛。所以“Garbage Collection”不是本入門指南的范圍尺锚,對“Garbage Collection”內(nèi)部機制感興趣的同學(xué)可以參考一些其他的資料,不過說老實話“Garbage Collection”不大適合適初學(xué)者研究惜浅。解決: 通過 alloc – initial 方式創(chuàng)建的, 創(chuàng)建后引用計數(shù)+1, 此后每 retain 一次引用計數(shù)+1, 那么在程序中做相應(yīng)次數(shù)的 release 就好了.2. (Reference Counted)手動內(nèi)存計數(shù):就是說瘫辩,從一段內(nèi)存被申請之后,就存在一個變量用于保存這段內(nèi)存被使用的次數(shù)坛悉,我們暫時把它稱為計數(shù)器伐厌,當計數(shù)器變?yōu)?0 的時候,那么就是釋放這段內(nèi)存的時候裸影。比如說挣轨,當在程序 A 里面一段內(nèi)存被成功申請完成之后,那么這個計數(shù)器就從 0 變成 1(我們把這個過程叫做 alloc)轩猩,然后程序 B 也需要使用這個內(nèi)存卷扮,那么計數(shù)器就從 1 變成了 2(我們把這個過程叫做 retain)。緊接著程序 A 不再需要這段內(nèi)存了均践,那么程序 A 就把這個計數(shù)器減 1(我們把這個過程叫做 release);程序 B 也不再需要這段內(nèi)存的時候晤锹,那么也把計數(shù)器減 1(這個過程還是 release)。當系統(tǒng)(也就是 Foundation)發(fā)現(xiàn)這個計數(shù)器變成了 0彤委,那么就會調(diào)用內(nèi)存回收程序把這段內(nèi)存回收(我們把這個過程叫做 dealloc)鞭铆。順便提一句,如果沒有 Foundation焦影,那么維護計數(shù)器车遂,釋放內(nèi)存等等工作需要你手工來完成。 解決:一般是由類的靜態(tài)方法創(chuàng)建的, 函數(shù)名中不會出現(xiàn) alloc 或 init 字樣, 如[NSString string]和[NSArray arrayWithObject:], 創(chuàng)建后引用計數(shù)+0, 在函數(shù)出棧后釋放, 即相當于一個棧上的局部變量.當然也可以通過retain延長對象的生 期.3.(NSAutoRealeasePool)內(nèi)存池:可以通過創(chuàng)建和釋放內(nèi)存池控制內(nèi)存申請和回收的時機.解決:是由 autorelease 加入系統(tǒng)內(nèi)存池, 內(nèi)存池是可以嵌套的, 每個內(nèi)存池都需要有一個創(chuàng)建釋放對, 就像 main 函數(shù)中寫的一樣. 使用也很簡單, 比如[[[NSString alloc]initialWithFormat:@”Hey you!”] autorelease], 即將一個NSString 對象加入到最內(nèi)層的系統(tǒng)內(nèi)存池, 當我們釋放這個內(nèi)存池時, 其中的對象都會被釋放.
十一偷办、需要在手動管理內(nèi)存分配和釋放的 Xcode項目中引入和編譯用 ARC風(fēng)格編寫的文件艰额,需要在文件的 CompilerFlags上添加參數(shù)(?)
-fobjc-arc
提示:
打開:-fobjc-arc
關(guān)閉:-fno-objc-arc