无法在 iOS7.1 应用程序上找到 EXC_BAD_ACCESS 的原因

Posted

技术标签:

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

我正在构建一个带有 MQTTKit 和 Estimote 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 有问题,一些变量从未使用过。 试试:***.com/questions/19840671/… 【参考方案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/… 你说得对,我的错,我没注意代码。感谢您指出:)

以上是关于无法在 iOS7.1 应用程序上找到 EXC_BAD_ACCESS 的原因的主要内容,如果未能解决你的问题,请参考以下文章

Phonegap 无法在 iPad 视网膜 mini iOS7 中使用相机

Xcode 版本 5.1.1 (5B1008) - 在 iOS 7.0 而不是 7.1 上运行模拟器

iPhone iOS8:从 iOS7.1 sdk 构建并在 8.0 及更高版本的设备上运行时,UIAlertView 倒置旋转无法正常工作

iOS 7.1 - 7.1.2 用户无法打开我的游戏

IOS7.1-7.1.1越狱后无法读取越狱文件的解决办法

在 iOS 7.1+ 中快速使用 UIAlertView