標籤:blog http io ar os 使用 sp strong on
本文轉載至 http://blog.sina.com.cn/s/blog_a843a8850101dxin.html
引自:http://blog.csdn.net/likendsl/article/details/7566305
我的摘要:
1、為什麼會使用NSZombieEnabled?
應用調試可能會收到類似 Thread 1: Program received signal:"EXC_BAD_ACCESS 這樣的錯誤提示資訊,這樣的資訊通常是記憶體操作錯誤引起,例如你對已釋放的對象發送訊息時就會出現,再如release 的對象再release,release 那些autorelease 的對象等
當設定NSZombieEnabled環境變數後,一個對象銷毀時會被轉化為_NSZombie,設定NSZombieEnabled後,當你向一個已經釋放的對象發送訊息,這個對象就不會向之前那樣Crash或者產生一個難以理解的行為,而是放出一個錯誤訊息,然後以一種可預測的可以產生debug斷點的方式消失, 因此我們就可以找到具體或者大概是哪個對象被錯誤的釋放了。
2、如何設定為NSZombieEnabled模式?
Xcode4 下設定 NSZombieEnabled 的方法:
方法一:Product -> Edit Scheme-> Arguments, 然後將點擊”加號”, 將 NSZombieEnabled 參數加到Environment Variables 視窗中, 後面的數值寫上 ”YES”.
方法二:Xcode4 菜單 Product -> EditScheme -> Diagnostics 設定視窗中直接勾上Enable ZombieObjects 即可
Xcode 可用 cmd+shift+< 進到這個視窗。
3、有沒有執行個體?
static NSMutableArray*array;
- (void)viewWillAppear:(BOOL)animated{
[array addObject:@"Hello"];//使用釋放掉的數組
}
-(void)viewDidLoad
{
[super viewDidLoad];
array= [[NSMutableArray alloc]initWithCapacity:5];
[array release];
[array addObject:@"Hello"];//之所以不會crash,是在於事件周期未完,記憶體回收機制還沒有執行,沒有真正的回收掉array的對象記憶體。
NSLog(@"%@",[array objectAtIndex:0]);
}
上例的運行結果:在未開啟NSZombieEnabled的狀態下,會輸出Hello,程式在調用之viewWillAppear的時候crash,開啟NSZombieEnabled的情況下,不會輸出Hello,在調用Hello的情況下應用即會停止運行,控制台報錯:
*** -[__NSArrayM respondsToSelector:]: message sent to deallocated instance 0x6aa0200
4、有什麼需要注意的?
NSZombieEnabled只能在調試的時候使用,千萬不要忘記在產品發布的時候去掉,因為NSZombieEnabled不會真正去釋放dealloc對象的記憶體,一直開啟後果可想而知
5、其它
CocoaDev,本人作者覺得講Cocoa技術十分專業的網站之一,下面的連結詳細講了講NSZombieEnable的原理。
http://www.cocoadev.com/index.pl?NSZombieEnabled
蘋果官方的Mac OS X Debugging Magic,詳細講述了最為一個進階蘋果程式員應該具備的調試技巧
http://developer.apple.com/library/mac/#technotes/tn2004/tn2124.html
其實還可以在Instruments中開啟NSZombie選項,這樣就可以在Instruments中直接查看crash時候的callstack了:
http://www.markj.net/iphone-memory-debug-nszombie/
iOS開發 殭屍調試