将CLBeacon设置为nil时的EXC_BAD_ACCESS

时间:2017-01-05 17:03:34

标签: ios core-location ibeacon

CLBeacon设置为nil时,以下内容会导致崩溃。

CLBeacon *beacon = [[CLBeacon alloc] init];
beacon = nil; // crash

是否无法取消分配已初始化的CLBeacon

只需将上面的代码添加到App Delegate的didFinishLaunchingWithOptions

内的新项目中即可重现
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    CLBeacon *beacon = [[CLBeacon alloc] init];
    beacon = nil; // crash
    return YES;
}

2 个答案:

答案 0 :(得分:2)

CLBeacon州的苹果文档:

  

您不直接创建此类的实例。位置管理器对象将遇到的信标报告给其关联的委托对象。

它崩溃的原因是一个实际细节并不重要,但这是因为当你只是调用CLBeaconinit没有正确初始化。取消分配后,CLBeacon取消引用_internal ivar,如果NULL则崩溃。

您可以通过查看调试器中CLBeacon->_internal ivar的值来看到这一点。如果您使用init创建信标,则ivar为NULL,但如果您使用[[CLBeacon alloc] initWithCoder:nil]创建信标,则它将具有值,并且当您设置信标时它不会崩溃到nil

答案 1 :(得分:0)

使用模拟子类时遇到此问题。每次ARC释放模拟的子类时,我的测试都会崩溃。

解决方法是在CLBeacon上调用正确的init方法。 看here我们看到有一个额外的init方法。在代码中的类别中声明它。

@interface CLBeacon (PRXInternal)

- (id)initWithProximityUUID:(id)arg1 major:(id)arg2 minor:(id)arg3 proximity:(long long)arg4 accuracy:(double)arg5 rssi:(long long)arg6 ;

@end

如果您需要该类的实例,请调用此初始值设定项。不要包含在生产代码中。