EXC_BAD_ACCESS设置CLBeacon为零时(EXC_BAD_ACCESS when se

2019-09-25 21:07发布

设置时,以下将执行崩溃CLBeacon到nil

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

是没可能取消分配的初始化CLBeacon


这可以通过简单地添加代码被复制到上面的应用程序委托的内部新鲜项目didFinishLaunchingWithOptions

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    CLBeacon *beacon = [[CLBeacon alloc] init];
    beacon = nil; // crash
    return YES;
}

Answer 1:

对于苹果文档CLBeacon指出:

你不直接创建该类的实例。 位置管理对象报告中遇到的信标到其关联的委托对象。

它崩溃的原因是一个实现细节并不重要,但它是由于这样的事实, CLBeacon s的不正确初始化时,你只需要调用init 。 当它重新分配, CLBeacon解引用它的_internal伊娃和崩溃,如果它是NULL

您可以通过查看值看到这个CLBeacon->_internal在调试器伊娃。 如果您在使用创建信标init然后伊娃是NULL的,但如果你用它创建[[CLBeacon alloc] initWithCoder:nil]将有一个价值,当你设置的灯塔,它不会崩溃nil



Answer 2:

就遇到了这个问题,同时用嘲笑的子类。 我的测试中会崩溃每次嘲笑子类是由ARC dealloced时间。

解决方法是调用CLBeacon正确的init方法。 看这里 ,我们看到,有一个另外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

如果你需要的类的实例,调用此初始化。 不包括在生产代码。



文章来源: EXC_BAD_ACCESS when setting a CLBeacon to nil