NSZombieEnabled使用
我們做iOS?程序開發(fā)時經(jīng)常用遇到?EXC_BAD_ACCESS?錯誤導(dǎo)致?Crash,出現(xiàn)這種錯誤時一般?Xcode?不會給我們太多的信息來定位錯誤來源,只是在應(yīng)用?Delegate?上留下像Thread 1: Program received signal:"EXC_BAD_ACCESS",讓問題無從找起。
比如你對已釋放的對象發(fā)送消息時就會出現(xiàn),EXC_BAD_ACCESS,再如release?的對象再?release,release?那些autorelease?的對象等也會報這樣的錯。默認設(shè)置下?Xcode?不會給你定位具體是哪一行代碼,不該去使用已釋放的對象,或者release?用錯了。
比如?UIViewController?子類中這樣的代碼:
[cpp]?view plaincopyprint?不過NSZombieEnabled?環(huán)境變量可以幫我們的忙,就是當設(shè)置NSZombieEnabled環(huán)境變量后,一個對象銷毀時會被轉(zhuǎn)化為_NSZombie,設(shè)置NSZombieEnabled后,當你向一個已經(jīng)釋放的對象發(fā)送消息,這個對象就不會向之前那樣Crash或者產(chǎn)生一個難以理解的行為,而是放出一個錯誤消息,然后以一種可預(yù)測的可以產(chǎn)生debug斷點的方式消失, 因此我們就可以找到具體或者大概是哪個對象被錯誤的釋放了。?
對?Xcode?設(shè)置了NSZombieEnabled?之后,Xcode?會明確定位在行[array addObject:@"Hello"],然后控制臺下報的錯誤信息是:
*** -[__NSArray addObject:]:message sent to deallocated instance 0x6557370
如何設(shè)置?NSZombieEnabled?呢,在?Xcode3?和?Xcode4?下設(shè)置不一樣,Xcode4?下設(shè)置很簡單。
Xcode3?下?NSZombieEnabled?設(shè)置方法如下:
1.???在XCode左邊那個Groups& Files欄中找到Executables,雙擊其中的一項,或者右鍵Get Info;
2.??切換到Arguments?
3.??這里一共有兩個框,在下面那個Variables to be set in theenvironment:點+號添加一項,Name里填NSZombieEnabled,Value填Yes,要保證前面的鉤是選中的。
Xcode4?下設(shè)置?NSZombieEnabled?的方法:
你可以點擊 Xcode4 菜單 Product -> Edit Scheme-> Arguments, 然后將點擊”加號”, 將 NSZombieEnabled 參數(shù)加到Environment Variables 窗口中, 后面的數(shù)值寫上 ”YES”.
或者在 Xcode4 菜單?Product -> EditScheme ->?Diagnostics 設(shè)置窗口中直接勾上Enable ZombieObjects?即可,Xcode?可用?cmd+shift+<?進到這個窗口。
Xcode4?已經(jīng)考慮到了現(xiàn)在的要求,所以提供了更便捷的設(shè)置的方式,你也可以在這個窗口中設(shè)置其他一些參數(shù),你肯定能由此獲得更多的幫助信息。
另外再說一下,如果沒有為?Xcode?設(shè)置?NSZombieEnable,像下面的代碼或許可以正確執(zhí)行,打印出你所期望的結(jié)果“Hello”
[cpp]?view plaincopyprint?但是一旦加上了NSZombieEnable?設(shè)置,上面的代碼行??[array addObject:@"Hello"]?也將無法投機取巧了,同樣會得到錯誤提示:
*** -[__NSArrayM addObject:]:message sent to deallocated instance 0x6557370
即使該array?所指向的內(nèi)存還是原來的數(shù)據(jù)也不能逃脫掉?NSZombieEnable?的法眼。也就是之所以未設(shè)置?NSZombieEnable?時上面代碼能得到正確結(jié)果,是因為,雖然 [array release]?是標記為釋放掉該內(nèi)存塊,但是后面使用?array?時,因為該指針指向的內(nèi)存數(shù)據(jù)未被覆蓋,所以未出錯,這和C++?的指針 delete?后的效果是一樣的。
最后提醒NSZombieEnabled只能在調(diào)試的時候使用,千萬不要忘記在產(chǎn)品發(fā)布的時候去掉,因為NSZombieEnabled不會真正去釋放dealloc對象的內(nèi)存,一直開啟后果可想而知,自重!
注:
1.蘋果官方的Mac OS X Debugging Magic,詳細講述了最為一個高級蘋果程序員應(yīng)該具備的調(diào)試技巧?http://developer.apple.com/library/mac/#technotes/tn2004/tn2124.html
2.其實還可以在Instruments中開啟NSZombie選項,這樣就可以在Instruments中直接查看crash時候的callstack了:http://www.markj.net/iphone-memory-debug-nszombie/
本文轉(zhuǎn)載自:http://blog.csdn.net/likendsl/article/details/7566305
總結(jié)
以上是生活随笔為你收集整理的NSZombieEnabled使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CoreAnimation编程指南(四)
- 下一篇: React Native使用指南-植入原