【转】EXC_BAD_ACCESS问题在xode4下的调试技巧
EXC_BAD_ACCESS這個(gè)問題一直不好調(diào)試,之前有看到過說配置一個(gè)環(huán)境變量可以很方便的跟蹤問題,因此試了一下,發(fā)現(xiàn)還真是方便了很多,以下是XCODE 4的配置方法: Edit Scheme->Arguments->Environment variables 增加 NSZombieEnabled ,設(shè)置為YES,并勾選上,OK,再次運(yùn)行,在console就會(huì)顯示出出錯(cuò)的地方了.
(另外: NSLog(@"id : %@",id); //id is integer,should be printed as %d 像這樣的語句也會(huì)引起EXC_BAD_ACCESS,大家要注意了哦 )
首先說一下 EXC_BAD_ACCESS 這個(gè)錯(cuò)誤,可以這么說,90%的錯(cuò)誤來源在于對(duì)一個(gè)已經(jīng)釋放的對(duì)象進(jìn)行release操作。
舉一個(gè)簡(jiǎn)單的例子來說明吧,首先看一段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中很常見也很普遍,這不會(huì)產(chǎn)生任何問題。但是到了 Objective-C 中,就會(huì)出事,考慮這個(gè)程序:
#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];//內(nèi)存泄露
[s release];//錯(cuò)誤釋放
[pool drain];//EXC_BAD_ACCESS
return 0; }
這個(gè)例子當(dāng)然狠容易的看出問題所在,如果這段代碼包含在一個(gè)很大的邏輯中,確實(shí)容易被忽略。Objective-C 這段代碼有三個(gè)致命問題:1、內(nèi)存泄露;2、錯(cuò)誤釋放;3、造成 EXC_BAD_ACCESS 錯(cuò)誤。
1, NSString* s = [[NSString alloc]initWithString:@”This is a test string”]; 創(chuàng)建了一個(gè) NSString Object,隨后的 s = [s substringFromIndex:[s rangeOfString:@"a"].location]; 執(zhí)行后,導(dǎo)致創(chuàng)建的對(duì)象引用消失,直接造成內(nèi)存泄露。
2,錯(cuò)誤釋放。[s release]; 這個(gè)問題,原因之一是一個(gè)邏輯錯(cuò)誤,以為 s 還是我們最初創(chuàng)建的那個(gè) NSString 對(duì)象。第二是因?yàn)閺?substringFromIndex:(NSUInteger i) 這個(gè)方法返回的 NSString 對(duì)象,并不需要我們來釋放,它其實(shí)是一個(gè)被 substringFromIndex 方法標(biāo)記為 autorelease 的對(duì)象。如果我們強(qiáng)行的釋放了它,那么會(huì)造成 EXC_BAD_ACCESS 問題。
3, EXC_BAD_ACCESS。由于 s 指向的 NSString 對(duì)象被標(biāo)記為 autorelease, 則在 NSAutoreleasePool 中已有記錄。但是由于我們?cè)谇懊驽e(cuò)誤的釋放了該對(duì)象,則當(dāng) [pool drain] 的時(shí)候,NSAutoreleasePool 又一次的對(duì)它記錄的 s 對(duì)象調(diào)用了 release 方法,但這個(gè)時(shí)候 s 已經(jīng)被釋放不復(fù)存在,則直接導(dǎo)致了 EXC_BAD_ACCESS問題。
總結(jié)
以上是生活随笔為你收集整理的【转】EXC_BAD_ACCESS问题在xode4下的调试技巧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL与MongoDB设计实例对比
- 下一篇: 如何检查MyISAM表的错误?