将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;
}
答案 0 :(得分:2)
CLBeacon州的苹果文档:
您不直接创建此类的实例。位置管理器对象将遇到的信标报告给其关联的委托对象。
它崩溃的原因是一个实际细节并不重要,但这是因为当你只是调用CLBeacon
时init
没有正确初始化。取消分配后,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
如果您需要该类的实例,请调用此初始值设定项。不要包含在生产代码中。