【问题标题】:unable to find cause of EXC_BAD_ACCESS on a iOS7.1 app无法在 iOS7.1 应用程序上找到 EXC_BAD_ACCESS 的原因
【发布时间】:2014-07-03 22:16:43
【问题描述】:

我正在构建一个带有 MQTTKitEstimote iOS SDK 的小型演示应用程序,用于对信标进行范围划分并将信标邻近 uuid、主要和次要发送到 MQTT 代理。

该示例在一段时间内可以正常工作,但有时它会崩溃并且我在Thread 1 - Queue:com.apple.main-thread 上收到EXC_BAD_ACCESS (code=2, address=0x27c8eff4))。在 XCode 中,调试时抛出异常时我可以看到以下内容:

CoreFoundation`CFRelease:
0x2fdc9f54:  push   {r4, r5, r6, r7, lr}

这就是异常发生的地方,但我不知道它代表什么,也不知道它意味着什么。

谁能指出我没有保留或释放到早期的东西,因为从我所读到的东西是被释放到早期并在释放后尝试访问它们的对象行中的一些东西?

编辑:根据评论的建议,我启用了NSZombies 和异常断点,现在我得到了更多信息:

Pulsr(21312,0x3cb4118c) malloc: *** error for object 0x16f27404: incorrect checksum for freed object - object was probably modified after being freed. *** set a breakpoint in malloc_error_break to debug

它停在的那一行是[UIView animateWith ...];

dispatch_async(dispatch_get_main_queue(), ^(void){

    [UIView animateWithDuration:0.250
                          delay:0
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^{
                         weakSelf.streamingCountLabel.layer.backgroundColor = streaming ? weakSelf.yellowColor.CGColor : weakSelf.redColor.CGColor;
                     }
                     completion:nil];

    if (!streaming)
    {
        weakSelf.streamingCountLabel.text = @"0";
    }
});

【问题讨论】:

  • 找不到线路? NSZOmbies 没有帮助你?
  • 启用异常断点,并在您的问题中包含调用堆栈。此外,按照@Larme 的建议启用 Zombies。您将能够很容易地找到所有这些步骤的说明
  • 尝试为您的项目运行Analyze,有时它能够找到您遗漏的明显问题。
  • @a-live 我已经做到了,唯一的问题是其中一个 pod 有问题,一些变量从未使用过。

标签: ios objective-c ios7 exc-bad-access


【解决方案1】:

我首先想到的是这部分:

- (instancetype)init
{
    self = [super init];
    return [self initWithUUID:ESTIMOTE_PROXIMITY_UUID identifier:@"Pulsr"];
}

- (instancetype)initWithUUID:(NSUUID *)uuid identifier:(NSString *)identifier
{
    self = [super init];

    if (self) {
        _manager = [[ESTBeaconManager alloc] init];
        _region = [[ESTBeaconRegion alloc] initWithProximityUUID:uuid identifier:identifier];
    }

    return self;
}

你在一个 alloc 上调用了 [super init] 两次。这可能不是问题,但绝对是错误的方法。在这种情况下,只需从 init 方法中删除 [super init]。

【讨论】:

  • 如果我删除它,这意味着如果我只打电话给init,我就不会再打电话给[super init]了。
  • 不,它不会——在initWithUUID:... 内部调用了超级初始化。这是您的指定初始化程序: : developer.apple.com/library/ios/documentation/general/…
  • 你说得对,我的错,我没注意代码。感谢您指出:)
猜你喜欢
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 2011-11-15
  • 2011-11-14
相关资源
最近更新 更多