调试Iphone程序收到信号:“EXC_BAD_ACCESS”

时间:2010-01-03 19:30:42

标签: iphone objective-c xcode

我搜索并尝试了很多。但我真的不知道如何解决这个问题 - 感谢您的帮助

错误-MSG:

Program received signal:  “EXC_BAD_ACCESS”.

线投掷MSG

log(sos_Trace, @"sendMail");

重要

我使用了这个logging-lib:http://code.google.com/p/soslog-objc/

完整的SourceFile

#import "ContactViewController.h"
#import "SOSLog.h"

@implementation ContactViewController

@synthesize mailButton, delegate;

- (void)viewDidLoad {  
    self.view.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"bg_tile.gif"]];  
    [super viewDidLoad];  
}  

- (IBAction)sendMail:(id)sender {
    NSLog(@"sendMail");
    log(sos_Trace, @"sendMail");

    [delegate mail:self];
}

- (void)dealloc {
    [self.mailButton release];
    self.delegate = nil;
    [super dealloc];
}

@end

4 个答案:

答案 0 :(得分:2)

看一下SOS日志记录框架的来源,log(sos_Trace, @"sendMail");不可能是崩溃的来源,除非你有其他地方的代码破坏了日志记录基础设施的内部。

发布崩溃的完整堆栈跟踪。

正如@benzado所说,你的内存管理代码中有一些错误。解决这些问题。我建议在代码上运行静态分析器并修复它找到的任何内容。 Xcode中的shift-cmd-A应该可以解决问题。

此外,如果您想在调用方法时进行记录,这将在任何方法中起作用:

log(sos_Trace, NSStringFromSelector(_cmd));

或者:

NSLog(@"[%@ %@] -- your message here", NSStringFromClass([self class]), NSStringFromSelector(_cmd));

答案 1 :(得分:1)

之前我没有使用过soslog框架,因此我无法提供任何见解。但是,EXC_BAD_ACCESS通常是由于尝试访问已被dealloc'd或从未初始化的对象而引起的。在你打电话之前已经设置了sos_Trace吗?

答案 2 :(得分:1)

EXC_BAD_ACCESS表示您尝试访问无效地址的内存。当您尝试使用尚未初始化的指针并指向内存中的某个随机位置时,通常会发生这种情况。

我对该日志库一无所知,但我猜想有一些你需要调用的设置或初始化函数。但是看看网站似乎并不存在。


另一个突出的事情,虽然可能没有关系,但行

[self.mailButton release];

在您的dealloc方法中。这可能不是问题,因为它在你的dealloc方法中,但是如果你要使用属性访问器,你应该保留并释放它。如果您在任何其他地方有该行,如果重新分配了mailButton属性,则稍后会导致EXC_BAD_ACCESS。那是因为:

self.mailButton = THING; // retain count +1
[self.mailButton release]; // retain count -1
self.mailButton = OTHER; // EXC_BAD_ACCESS!

那是因为第三行实际上是对setMailButton:的调用,内部调用[THING release],但是由于你已经释放了它,你现在已经使你的保留/释放调用失去平衡,所以当时或之后(如果其他人保留了它),将在无效对象上调用release,并且你的程序会变成kablooey。

答案 3 :(得分:0)

修正了错误。由于缺少保留,套接字被解除分配。