日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NSZombieEnabled使用

發(fā)布時間:2024/7/23 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NSZombieEnabled使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我們做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?
  • static?NSMutableArray*array;??
  • ???
  • -(void)viewDidLoad??
  • {??
  • ????[superviewDidLoad];??
  • ????array=?[[NSMutableArray?alloc]initWithCapacity:5];??
  • ????[array?release];//釋放掉該數(shù)組??
  • }??
  • ???
  • -?(void)viewWillAppear:(BOOL)animated{?????
  • ????[array?addObject:@"Hello"];//使用釋放掉的數(shù)組??
  • } ?
  • 上面的代碼就會出現(xiàn)EXC_BAD_ACCESS?錯誤,但我執(zhí)行時?Xcode?一出錯卻是定位在我在?AppDelegate?的?application:didFinishLaunchingWithOptions:?方法上的某行了,如果代碼量多了,要查找具體問題非常難,但憑經(jīng)驗了。

    不過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?
  • static?NSMutableArray*array;??
  • ???
  • -(void)viewDidLoad??
  • {??
  • ????[super?viewDidLoad];??
  • ????array=?[[NSMutableArray?alloc]initWithCapacity:5];??
  • ????[array?release];??
  • ????[array?addObject:@"Hello"];//之所以不會crash,是在于事件周期未完,內(nèi)存回收機制還沒有執(zhí)行,沒有真正的回收掉array的對象內(nèi)存。??
  • ????NSLog(@"%@",[array?objectAtIndex:0]);??
  • } ?
  • 但是一旦加上了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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。