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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【转】EXC_BAD_ACCESS问题在xode4下的调试技巧

發布時間:2024/9/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】EXC_BAD_ACCESS问题在xode4下的调试技巧 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

EXC_BAD_ACCESS這個問題一直不好調試,之前有看到過說配置一個環境變量可以很方便的跟蹤問題,因此試了一下,發現還真是方便了很多,以下是XCODE 4的配置方法: Edit Scheme->Arguments->Environment variables 增加 NSZombieEnabled ,設置為YES,并勾選上,OK,再次運行,在console就會顯示出出錯的地方了.

(另外: NSLog(@"id : %@",id); //id is integer,should be printed as %d 像這樣的語句也會引起EXC_BAD_ACCESS,大家要注意了哦 )

首先說一下 EXC_BAD_ACCESS 這個錯誤,可以這么說,90%的錯誤來源在于對一個已經釋放的對象進行release操作。

舉一個簡單的例子來說明吧,首先看一段Java代碼:

public class Test{

public static void main(String[] args)

{

String s = “This is a test string”;

s = s.substring(s.indexOf(“a”),(s.length())); System.out.println(s);

}

}

這種寫法在Java中很常見也很普遍,這不會產生任何問題。但是到了 Objective-C 中,就會出事,考慮這個程序:

#import??

int main (int argc, const char * argv[])

{ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

NSString* s = [[NSString alloc]initWithString:@”This is a test string”];

s = [s substringFromIndex:[s rangeOfString:@"a"].location];//內存泄露

[s release];//錯誤釋放

[pool drain];//EXC_BAD_ACCESS

return 0; }

這個例子當然狠容易的看出問題所在,如果這段代碼包含在一個很大的邏輯中,確實容易被忽略。Objective-C 這段代碼有三個致命問題:1、內存泄露;2、錯誤釋放;3、造成 EXC_BAD_ACCESS 錯誤。

1, NSString* s = [[NSString alloc]initWithString:@”This is a test string”]; 創建了一個 NSString Object,隨后的 s = [s substringFromIndex:[s rangeOfString:@"a"].location]; 執行后,導致創建的對象引用消失,直接造成內存泄露。

2,錯誤釋放。[s release]; 這個問題,原因之一是一個邏輯錯誤,以為 s 還是我們最初創建的那個 NSString 對象。第二是因為從 substringFromIndex:(NSUInteger i) 這個方法返回的 NSString 對象,并不需要我們來釋放,它其實是一個被 substringFromIndex 方法標記為 autorelease 的對象。如果我們強行的釋放了它,那么會造成 EXC_BAD_ACCESS 問題。

3, EXC_BAD_ACCESS。由于 s 指向的 NSString 對象被標記為 autorelease, 則在 NSAutoreleasePool 中已有記錄。但是由于我們在前面錯誤的釋放了該對象,則當 [pool drain] 的時候,NSAutoreleasePool 又一次的對它記錄的 s 對象調用了 release 方法,但這個時候 s 已經被釋放不復存在,則直接導致了 EXC_BAD_ACCESS問題。

總結

以上是生活随笔為你收集整理的【转】EXC_BAD_ACCESS问题在xode4下的调试技巧的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。