iOS開發 殭屍調試

來源:互聯網
上載者:User

標籤: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開發 殭屍調試

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.