【问题标题】:Debug Iphone Program received signal: “EXC_BAD_ACCESS”Debug Iphone Program收到信号:“EXC_BAD_ACCESS”
【发布时间】:2010-01-03 19:30:42
【问题描述】:

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

错误信息:

Program received signal:  “EXC_BAD_ACCESS”.

投掷味精的线

log(sos_Trace, @"sendMail");

重要

我使用了这个日志库:http://code.google.com/p/soslog-objc/

完整的源文件

#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

【问题讨论】:

    标签: iphone objective-c xcode


    【解决方案1】:

    查看 SOS 日志框架的源代码,log(sos_Trace, @"sendMail"); 不可能是崩溃的源头除非您在其他地方有代码破坏了日志基础架构的内部结构。 p>

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

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

    另外,如果您想在调用方法时记录日志,这将适用于任何方法

    log(sos_Trace, NSStringFromSelector(_cmd));
    

    或者:

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

    【讨论】:

      【解决方案2】:

      我之前没有使用过 soslog 框架,所以我无法提供任何见解。但是,EXC_BAD_ACCESS 经常是由于试图访问一个已被释放或从未初始化过的对象而导致的。 sos_Trace 在你调用之前设置好了吗?

      【讨论】:

      • 我简单地查看了库文档,看起来 sos_Trace 是一个枚举。
      【解决方案3】:

      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。

      【讨论】:

        【解决方案4】:

        修复了错误。由于缺少保留,套接字被释放。

        【讨论】:

          猜你喜欢
          • 2011-07-17
          • 2010-09-24
          • 2011-05-08
          • 1970-01-01
          • 2021-08-13
          • 2011-03-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多