Xcode 8 Instruments 學(xué)習(xí)(四)

這邊文章不是講Instruments 的,另外兩種檢測(cè)內(nèi)存泄漏的方法

內(nèi)存泄漏矮冬。其實(shí)有兩種泄漏。
第一個(gè)是真正的內(nèi)存泄漏次哈,一個(gè)對(duì)象尚未被釋放胎署,但是不再被引用的了。因此窑滞,存儲(chǔ)器不能被重新使用琼牧。
第二類泄漏是比較麻煩一些径筏。這就是所謂的“無界內(nèi)存增長(zhǎng)”。這發(fā)生在內(nèi)存繼續(xù)分配障陶,并永遠(yuǎn)不會(huì)有機(jī)會(huì)被釋放滋恬。
如果永遠(yuǎn)這樣下去你的程序占用的內(nèi)存會(huì)無限大,當(dāng)超過一定內(nèi)存的話 會(huì)被系統(tǒng)的看門狗給kill掉.

另外兩種檢測(cè)內(nèi)存泄漏的方法
第一種

NSZombieEnabled設(shè)置的使用 (z?mbi 僵尸 )
雖然iOS 5.0版本之后加入了ARC機(jī)制,由于相互引用關(guān)系比較復(fù)雜時(shí)抱究,內(nèi)存泄露還是可能存在恢氯。所以了解原理很重要。如果知道crash的地方了鼓寺,但是不知道具體crash的原因應(yīng)該怎么辦勋拟?
又或者當(dāng)遇到EXC_BAD_ACCESS錯(cuò)誤的時(shí)候,該怎么處理妈候?

(設(shè)置 Enable Zombie Objects參數(shù)敢靡,在可執(zhí)行選項(xiàng),這有時(shí)候有助于縮小問題原因苦银。

具體設(shè)置方法是:點(diǎn)擊Product--> Scheme -->Edit Scheme 在Run選項(xiàng)的Diagnositics中設(shè)置Enable Zombie Objects啸胧。然后Close。再次運(yùn)行幔虏,可能會(huì)出現(xiàn)一些問題提示纺念。)

1、運(yùn)行Demo想括。
先實(shí)現(xiàn)準(zhǔn)備好的內(nèi)存泄露的Demo:leak app

打開運(yùn)行陷谱,崩潰截圖:如圖五
圖五.png
2.解決方案: 設(shè)置NSZombieEnabled
這是一個(gè) “EXC_BAD_ACCESS”錯(cuò)誤。我們打開XCode的選項(xiàng):“NSZombieEnabled” 瑟蜈。在crash時(shí)可能會(huì)給你更多的一些提示信息烟逊。如圖四 選擇Edit Scheme 會(huì)出現(xiàn)一個(gè)彈窗如圖六操作 勾選 Zomble Objects

3.再次運(yùn)行,再次crash铺根,這次在output窗口會(huì)看到多了一項(xiàng)錯(cuò)誤信息: 2016-11-05 16:51:27.916 XXX [27377:981617] *** -[People setStr:]: message sent to deallocated instance 0x60800000c380
大概意思是:向已釋放的內(nèi)存發(fā)送消息宪躯。也就是說使用了已釋放的內(nèi)存,在C語言相當(dāng)于使用了“野指針”

第二種

靜態(tài)內(nèi)存分析--> Analyze
分析到哪里有內(nèi)存泄露 ( an(?)l??z 愛ne來z 對(duì)...分析)
1.不運(yùn)行程序夷都, app沒有了Crash,直接對(duì)代碼進(jìn)行內(nèi)存分析眷唉,查看一下代碼是否有內(nèi)存泄露
優(yōu)點(diǎn):分析速度快,并且可以對(duì)所有的代碼進(jìn)行內(nèi)存分析
缺點(diǎn):分析結(jié)果不一定準(zhǔn)確(沒有運(yùn)行程序囤官,根據(jù)代碼的上下文語法結(jié)構(gòu))
2.注意:如果有提示有內(nèi)存泄露,一定結(jié)合代碼查看代碼是否有問題
操作步驟:
1蛤虐、Analyze是靜態(tài)分析工具 可以通過菜單 Product→Analyze啟動(dòng)
或者
2党饮、(shift+command+b) 圖八

圖八.png
效果如:圖七
圖七.png
點(diǎn)擊 圖九 里的藍(lán)色按鈕
圖九.png
顯示如圖十 所示
圖十.png

Analyze-xcode編輯和解析工具
iOS的分析工具可以發(fā)現(xiàn)編譯中的warning,內(nèi)存泄漏隱患驳庭,甚至還可以檢查出logic上的問題刑顺;所以在自測(cè)階段一定要解決Analyze發(fā)現(xiàn)的問題氯窍,可以避免出現(xiàn)嚴(yán)重的bug;
內(nèi)存泄漏隱患提示:Potential Leak of an object allocated on line ……
數(shù)據(jù)賦值隱患提示:The left operand of …… is a garbage value;
對(duì)象引用隱患提示:Reference-Counted object is used after it is released;

動(dòng)態(tài)內(nèi)存分析(Profile == Instruments )

真正運(yùn)行程序蹲堂,對(duì)程序進(jìn)行內(nèi)存分析(查看內(nèi)存分配情況狼讨、內(nèi)存泄露)
優(yōu)點(diǎn):分析非常準(zhǔn)確,如果發(fā)現(xiàn)有提示內(nèi)存泄露柒竞,基本可以斷定代碼問題
缺點(diǎn):分析效率低(真正運(yùn)行了一段代碼政供,才能對(duì)該代碼進(jìn)行內(nèi)存分析)
注意點(diǎn):如果發(fā)現(xiàn)有內(nèi)存泄露,基本需要修改代碼(基本有內(nèi)泄露)
操作步驟: Product -->Profile-->Allocations
二.內(nèi)存使用注意
1.加載小圖片\使用頻率比較高的圖片
1> 利用imageNamed:方法加載過的圖片, 永遠(yuǎn)有緩存, 這個(gè)緩存是由系統(tǒng)管理的, 無法通過代碼銷毀緩存
2.加載大圖片\使用頻率比較低的圖片(一次性的圖片, 比如版本新特性的圖片)
1> 利用
initWithContentsOfFile:\imageWithContentsOfFile:\imageWithData:等方法加載過的圖片, 沒有緩存, 只要用完了, 就會(huì)自動(dòng)銷毀
2> 基本上, 除imageNamed:方法以外, 其他加載圖片的方式, 都沒有緩存
三.2個(gè)專業(yè)術(shù)語
1.內(nèi)存泄漏
1> 該釋放的對(duì)象, 沒有被釋放(已經(jīng)不再使用的對(duì)象, 沒有被釋放)
2.內(nèi)存溢出(Out Of Memory)
1> 內(nèi)存不夠用了
2> 數(shù)據(jù)長(zhǎng)度比較小的數(shù)據(jù)類型 存儲(chǔ)了 數(shù)據(jù)長(zhǎng)度比較大的數(shù)據(jù)
四.圖片在沙盒中的存在形式(d??pl??m(?)nt,部署)
1.如果項(xiàng)目的Deployment Target <= 6.x (不支持圖片壓縮)
1> 所有圖片直接暴露在沙盒的資源包(main Bundle), 不會(huì)壓縮到Assets.car文件
2.如果項(xiàng)目的Deployment Target >= 7.x (支持圖片壓縮)
1> 放在Images.xcassets里面的所有圖片會(huì)壓縮到Assets.car文件, 不會(huì)直接暴露在沙盒的資源包(main Bundle)
2> 沒有放在Images.xcassets里面的所有圖片會(huì)直接暴露在沙盒的資源包(main Bundle), 不會(huì)壓縮到Assets.car文件
3.總結(jié)
1> 會(huì)壓縮到Assets.car文件, 沒有直接暴露在沙盒的資源包(main Bundle)

  • 條件 : "Deployment Target >= 7.x" 并且是 "放在Images.xcassets里面的所有圖片"
  • 影響 : 無法得到圖片的全路徑, 只能通過圖片名(imageNamed:方法)來加載圖片, 永遠(yuǎn)會(huì)有緩存

2> 不會(huì)壓縮到Assets.car文件, 直接暴露在沙盒的資源包(main Bundle)

  • 條件 : 除1> 以外的所有情況
  • 影響 : 可以得到圖片的全路徑, 可以通過全路徑(imageWithContentsOfFile:方法)來加載圖片, 不會(huì)有緩存

4.結(jié)論
1> 小圖片\使用頻率比較高的圖片
* 放在Images.xcassets里面
2> 大圖片\使用頻率比較低的圖片(一次性的圖片, 比如版本新特性的圖片)
* 不要放在Images.xcassets里面
五.設(shè)備信息相關(guān)的開發(fā)(非私有API, 底層API)
1.設(shè)備的型號(hào)
2.設(shè)備的CPU型號(hào)\使用情況
3.設(shè)備的內(nèi)存容量\使用情況
4.設(shè)備的硬盤容量\使用情況
5.......
6.推薦的第三方庫
uidevice-extension
* 地址 : https://github.com/erica/uidevice-extension
* 實(shí)現(xiàn)思路 : 利用分類給UIDevice進(jìn)行了擴(kuò)展
* 使用難易度 : 非常簡(jiǎn)單

 六.如何讓程序盡量減少內(nèi)存泄漏
 1.非ARC
 * Foundation對(duì)象(OC對(duì)象) : 只要方法中包含了alloc\new\copy\mutableCopy\retain等關(guān)鍵字, 那么這些方法產(chǎn)生的對(duì)象, 就必須在不再使用的時(shí)候調(diào)用1次release或者1次autorelease
 * CoreFoundation對(duì)象(C對(duì)象) : 只要函數(shù)中包含了create\new\copy\retain等關(guān)鍵字, 那么這些方法產(chǎn)生的對(duì)象, 就必須在不再使用的時(shí)候調(diào)用1次CFRelease或者其他release函數(shù)
 
 2.ARC(只自動(dòng)管理OC對(duì)象, 不會(huì)自動(dòng)管理C語言對(duì)象)
 * CoreFoundation對(duì)象(C對(duì)象) : 只要函數(shù)中包含了create\new\copy\retain等關(guān)鍵字, 那么這些方法產(chǎn)生的對(duì)象, 就必須在不再使用的時(shí)候調(diào)用1次CFRelease或者其他release函數(shù)
 
 3.block的注意
 // block的內(nèi)存默認(rèn)在棧里面(系統(tǒng)自動(dòng)管理)
 void (^test)() = ^{
 
 };
 // 如果對(duì)block進(jìn)行了Copy操作, block的內(nèi)存會(huì)遷移到堆里面(需要通過代碼管理內(nèi)存)
 Block_copy(test);
 // 在不需要使用block的時(shí)候, 應(yīng)該做1次release操作
 Block_release(test);
 [test release];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末朽基,一起剝皮案震驚了整個(gè)濱河市布隔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌稼虎,老刑警劉巖衅檀,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異霎俩,居然都是意外死亡哀军,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門打却,熙熙樓的掌柜王于貴愁眉苦臉地迎上來排苍,“玉大人,你說我怎么就攤上這事学密√匝茫” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵腻暮,是天一觀的道長(zhǎng)彤守。 經(jīng)常有香客問我,道長(zhǎng)哭靖,這世上最難降的妖魔是什么具垫? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮试幽,結(jié)果婚禮上筝蚕,老公的妹妹穿的比我還像新娘。我一直安慰自己铺坞,他們只是感情好起宽,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著济榨,像睡著了一般坯沪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上擒滑,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天腐晾,我揣著相機(jī)與錄音叉弦,去河邊找鬼。 笑死藻糖,一個(gè)胖子當(dāng)著我的面吹牛淹冰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播巨柒,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼樱拴,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了潘拱?” 一聲冷哼從身側(cè)響起疹鳄,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤芍锚,失蹤者是張志新(化名)和其女友劉穎叶沛,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壹将,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡禽最,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年腺怯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片川无。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呛占,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出懦趋,到底是詐尸還是另有隱情晾虑,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布仅叫,位于F島的核電站帜篇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏诫咱。R本人自食惡果不足惜笙隙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坎缭。 院中可真熱鬧竟痰,春花似錦、人聲如沸掏呼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哄尔。三九已至假消,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岭接,已是汗流浹背富拗。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸣戴,地道東北人啃沪。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像窄锅,于是被迫代替她去往敵國(guó)和親创千。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,283評(píng)論 25 707
  • 這邊文章不是講Instruments 的入偷,另外兩種檢測(cè)內(nèi)存泄漏的方法內(nèi)存泄漏追驴。其實(shí)有兩種泄漏。第一個(gè)是真正的內(nèi)存泄...
    清風(fēng)沐沐閱讀 868評(píng)論 0 0
  • 內(nèi)存管理 簡(jiǎn)述OC中內(nèi)存管理機(jī)制疏之。與retain配對(duì)使用的方法是dealloc還是release殿雪,為什么?需要與a...
    丶逐漸閱讀 1,971評(píng)論 1 16
  • 1锋爪,弱勢(shì)文化下的人性的利益驅(qū)動(dòng)丙曙。 2,存在即合理其骄,無知也是算“有知”吧亏镰。 3,基本生存階段沒有圖突破前拯爽,人都是無知...
    敬畏and感恩閱讀 132評(píng)論 0 0
  • 凜冽的寒風(fēng)索抓,感受著路上行人的瑟瑟發(fā)抖,安靜的走在街上毯炮,沒有多余的表情逼肯,只是靜靜地目視前方 到底內(nèi)心是有多堅(jiān)強(qiáng),才能...
    妖都三少閱讀 282評(píng)論 0 0