iOS_Zombie

最近我在看“ I am Zombie”赖淤,所以我就來(lái)看看iOS的這個(gè)工具啦蜀漆,哈哈,一大群Zombies正在逼近T酆怠H范绷耍!

什么是Zombie

是的,打開(kāi)instruments之后其實(shí)會(huì)看到一個(gè)圖標(biāo)鲜侥,這個(gè)圖標(biāo)多么讓人激動(dòng)肮邮肌!描函!哈哈

我們順便來(lái)看下官方文檔的說(shuō)法

The Zombies template causes persistent memory growth because it changes your environment so that deallocated objects are never technically deallocated. This is expected behavior, but it means that aside from zombie flags and memory address histories, any other statistics provided by the Allocations instrument should be ignored. You also shouldn’t add the Leaks instrument to the Zombies template, as it will produce inaccurate results. For iOS apps, use the Zombies template with the iOS Simulator, rather than a physical device.

不過(guò)我在嘗試的時(shí)候其實(shí)還沒(méi)有看到這段文字崎苗,所以我也是用了真機(jī),不過(guò)卡的是一塌糊涂舀寓。我查了網(wǎng)上大部分的資料胆数,有的會(huì)說(shuō)Zombie不支持真機(jī),其實(shí)就是rather than互墓,你懂的必尼,不過(guò)的確不建議用,本身調(diào)查的問(wèn)題在這個(gè)環(huán)境上關(guān)系不大篡撵,更多的純粹就是代碼上的問(wèn)題判莉。

用白話文來(lái)解釋下吧,取名Zombie其實(shí)是有道理的酸休,在iOS中我們經(jīng)常會(huì)有一些對(duì)象(雖然iOS在5.0之后引入了ARC)會(huì)手動(dòng)或者自動(dòng)被ARC銷毀掉骂租,但是我們的程序可能并不知道對(duì)象不在了,還可能去調(diào)用它斑司,導(dǎo)致了EXC_BAD_ACCESS的錯(cuò)誤渗饮。當(dāng)然,如果程序簡(jiǎn)單的話宿刮,很容易能夠排查出來(lái)互站,但是我們項(xiàng)目中大多是很復(fù)雜的,排查起來(lái)就有一定的困難僵缺。這個(gè)時(shí)候就會(huì)去使用Zombie工具來(lái)做輔助胡桃。注意,在專項(xiàng)里面工具都是輔助的磕潮,沒(méi)有一個(gè)工具是可以說(shuō)你做了1翠胰,2,3自脯,4步驟就知道問(wèn)題在哪兒之景,幾乎沒(méi)有,所以專項(xiàng)并不是很多人想的那么簡(jiǎn)單的膏潮。開(kāi)啟Zombie有兩種方式锻狗,一種是通過(guò)instruments來(lái)直接使用,網(wǎng)上都會(huì)很推薦這種做法,還有一種就是在如下設(shè)置中去運(yùn)行Zombie默認(rèn)就打包在app中轻纪,這種方法很不可取油额,因?yàn)橐坏┰谏暇€之前忘記關(guān)閉這個(gè)選項(xiàng)的話可是毀滅性的。

簡(jiǎn)單來(lái)講刻帚,Zombie會(huì)去取代那些已經(jīng)被銷毀的對(duì)象潦嘶,讓這些對(duì)象并不是null的存在,而是僵尸的存在我擂。這樣做的好處在于能夠給予我們更多的info來(lái)定位問(wèn)題衬以,而不好的話也是顯而易見(jiàn)的,上面官方的描述也寫(xiě)的很清楚校摩,一旦開(kāi)啟full on Zombie mode(這個(gè)詞來(lái)自于美劇I am Zombie)看峻,那么你的應(yīng)用的內(nèi)存會(huì)不停的飆升,因?yàn)槟愕膶?duì)象永遠(yuǎn)都不會(huì)銷毀衙吩,直到app crash互妓。所以這里大家要注意危險(xiǎn)性。

什么是ARC

這其實(shí)要詳細(xì)了解坤塞,大家可以自行Google冯勉,這里我就隨便截圖一段,科普一下
Automatic Reference Counting摹芙,自動(dòng)引用計(jì)數(shù)灼狰,即ARC,可以說(shuō)是WWDC2011和iOS5所引入的最大的變革和最激動(dòng)人心的變化浮禾。ARC是新的LLVM 3.0編譯器的一項(xiàng)特性交胚,使用ARC,可以說(shuō)一舉解決了廣大iOS開(kāi)發(fā)者所憎恨的手動(dòng)內(nèi)存管理的麻煩盈电。

在工程中使用ARC非常簡(jiǎn)單:只需要像往常那樣編寫(xiě)代碼蝴簇,只不過(guò)永遠(yuǎn)不寫(xiě)retain,release和autorelease三個(gè)關(guān)鍵字就好~這是ARC的基本原則。當(dāng)ARC開(kāi)啟時(shí)匆帚,編譯器將自動(dòng)在代碼合適的地方插入retain, release和autorelease熬词,而作為開(kāi)發(fā)者,完全不需要擔(dān)心編譯器會(huì)做錯(cuò)(除非開(kāi)發(fā)者自己錯(cuò)用ARC了)吸重。好了互拾,ARC相當(dāng)簡(jiǎn)單吧~到此為止,本教程結(jié)束嚎幸。

什么是EXC_BAD_ACCESS

90%的錯(cuò)誤來(lái)源在于對(duì)一個(gè)已經(jīng)釋放的對(duì)象進(jìn)行release操作颜矿。不過(guò)的確看到這個(gè)缺陷,項(xiàng)目一復(fù)雜鞭铆,很難去定位。

案例

所有說(shuō)專項(xiàng)的沒(méi)有案例都是耍流氓,真心覺(jué)得這是真理车遂。
我千辛萬(wàn)苦的隨便找了一個(gè)案例封断,然后發(fā)現(xiàn)啟動(dòng)之后就crash,我心都碎了舶担,那么偶爾我們也要來(lái)修一次bug不是坡疼?基本上我縮小了范圍,錯(cuò)誤代碼如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.

    // Add the navigation controller's view to the window and display.
    [self.window addSubview:navigationController.view];

    [self.window makeKeyAndVisible];

    return YES;
}

錯(cuò)誤信息如

2015-09-25 21:32:05.749 Zombie[24745:854954] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Application windows are expected to have a root view controller at the end of application launch'

反正我是不懂衣陶,經(jīng)過(guò)了Google之后柄瑰,我發(fā)現(xiàn)是iOS本身API的改變,應(yīng)該如下修改

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.

    // Add the navigation controller's view to the window and display.
-    [self.window addSubview:navigationController.view];
+    [self.window setRootViewController:navigationController];
    [self.window makeKeyAndVisible];

    return YES;
}

好了剪况,一切就妥妥的了教沾。經(jīng)過(guò)一系列的操作之后我們可以看到:


類似的錯(cuò)誤,然后可以看到如下的錯(cuò)誤時(shí)候的信息


好了译断,接著讓我們開(kāi)啟full on Zombie Mode吧授翻。使用Zombie來(lái)啟動(dòng)我們的應(yīng)用,按照同樣的操作孙咪,我們可以看到crash的時(shí)候會(huì)出現(xiàn)一個(gè)小的紫色旗子堪唐,上面的信息告訴我們,明顯是一個(gè)消息發(fā)給一個(gè)已經(jīng)被干掉的對(duì)象翎蹈。

我們可以點(diǎn)擊Zombie這條額外信息的右邊的小箭頭淮菠,可以看到如下的信息

這里我們可以看到有AutoRelease指向了我們的Zombie project,我們點(diǎn)擊進(jìn)入可以看到:

這里的lastString是一個(gè)AutoRelease的變量荤堪,而_lastString是指向這個(gè)字符串的指針合陵,所以當(dāng)被自動(dòng)釋放的時(shí)候,_lastString就指向了一個(gè)null逞力,從而就變成了我們最早看到的那個(gè)錯(cuò)誤曙寡。

至此,我們其實(shí)只要將lastString手動(dòng)的保留一下retain寇荧,這個(gè)程序就不會(huì)再crash了举庶。不過(guò)這個(gè)程序的確還是存在很多的內(nèi)存泄漏,作為之后的案例還是很不錯(cuò)的揩抡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末户侥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子峦嗤,更是在濱河造成了極大的恐慌蕊唐,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烁设,死亡現(xiàn)場(chǎng)離奇詭異替梨,居然都是意外死亡钓试,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門副瀑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)弓熏,“玉大人,你說(shuō)我怎么就攤上這事糠睡⊥炀希” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵狈孔,是天一觀的道長(zhǎng)信认。 經(jīng)常有香客問(wèn)我,道長(zhǎng)均抽,這世上最難降的妖魔是什么嫁赏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮到忽,結(jié)果婚禮上橄教,老公的妹妹穿的比我還像新娘。我一直安慰自己喘漏,他們只是感情好护蝶,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著翩迈,像睡著了一般持灰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上负饲,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天堤魁,我揣著相機(jī)與錄音,去河邊找鬼返十。 笑死妥泉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的洞坑。 我是一名探鬼主播盲链,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼迟杂!你這毒婦竟也來(lái)了刽沾?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤排拷,失蹤者是張志新(化名)和其女友劉穎侧漓,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體监氢,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡布蔗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年藤违,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纵揍。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纺弊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出骡男,到底是詐尸還是另有隱情,我是刑警寧澤傍睹,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布隔盛,位于F島的核電站,受9級(jí)特大地震影響拾稳,放射性物質(zhì)發(fā)生泄漏吮炕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一访得、第九天 我趴在偏房一處隱蔽的房頂上張望龙亲。 院中可真熱鬧,春花似錦悍抑、人聲如沸鳄炉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拂盯。三九已至,卻和暖如春记靡,著一層夾襖步出監(jiān)牢的瞬間谈竿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工摸吠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留空凸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓寸痢,卻偏偏與公主長(zhǎng)得像呀洲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子轿腺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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

  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,124評(píng)論 29 470
  • 1.項(xiàng)目經(jīng)驗(yàn) 2.基礎(chǔ)問(wèn)題 3.指南認(rèn)識(shí) 4.解決思路 ios開(kāi)發(fā)三大塊: 1.Oc基礎(chǔ) 2.CocoaTouch...
    陽(yáng)光的大男孩兒閱讀 4,969評(píng)論 0 13
  • 轉(zhuǎn):http://www.cocoachina.com/programmer/20151019/13746.htm...
    Style_偉閱讀 1,293評(píng)論 0 3
  • 37.cocoa內(nèi)存管理規(guī)則 1)當(dāng)你使用new两嘴,alloc或copy方法創(chuàng)建一個(gè)對(duì)象時(shí),該對(duì)象的保留計(jì)數(shù)器值為1...
    如風(fēng)家的秘密閱讀 829評(píng)論 0 4
  • Object-c的類可以多重繼承么?可以實(shí)現(xiàn)多個(gè)接口么?Category是什么?重寫(xiě)一個(gè)類的方式用繼承好還是分類好...
    small_Sun閱讀 734評(píng)論 0 0