我的調(diào)試bug總結(jié) 和 四舍五入代碼

四舍五入的方法調(diào)用

1.我們做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 的對象等也會報這樣的錯。默認(rèn)設(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)境變量可以幫我們的忙,就是當(dāng)設(shè)置NSZombieEnabled環(huán)境變量后,一個對象銷毀時會被轉(zhuǎn)化為_NSZombie,設(shè)置NSZombieEnabled后,當(dāng)你向一個已經(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+< 進到這個窗口。

NSZombieEnabled

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] 是標(biāo)記為釋放掉該內(nèi)存塊,但是后面使用 array 時,因為該指針指向的內(nèi)存數(shù)據(jù)未被覆蓋,所以未出錯,這和C++ 的指針 delete 后的效果是一樣的。

CocoaDev,個人覺得講Cocoa技術(shù)十分專業(yè)的網(wǎng)站之一,下面的鏈接詳細講了講NSZombieEnable的原理。http://www.cocoadev.com/index.pl?NSZombieEnabled

蘋果官方的Mac OS X Debugging Magic,詳細講述了最為一個高級蘋果程序員應(yīng)該具備的調(diào)試技巧 http://developer.apple.com/library/mac/#technotes/tn2004/tn2124.html

其實還可以在Instruments中開啟NSZombie選項,這樣就可以在Instruments中直接查看crash時候的callstack了:http://www.markj.net/iphone-memory-debug-nszombie/

最后提醒NSZombieEnabled只能在調(diào)試的時候使用,千萬不要忘記在產(chǎn)品發(fā)布的時候去掉,因為NSZombieEnabled不會真正去釋放dealloc對象的內(nèi)存,一直開啟后果可想而知,自重!

本文鏈接 http://unmi.cc/nszombieenabled-locate-exc_bad_access-error,來自 隔葉黃鶯 Unmi Blog

2.可以讓scrollView隱藏鍵盤【self.stuSetScrollV setKeyboardDismissMode:UIScrollViewKeyboardDismissModeOnDrag];】

3.Process launch failed: timed out trying to launch app

解決:You are using distribution provisioning profile rather than development profile. check this link

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容