将CLBeacon设置为零时EXC_BAD_ACCESS

将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; } 

CLBeacon的苹果文档指出:

你不直接创build这个类的实例。 位置pipe理器对象将遇到的信标报告给其关联的委托对象。

它崩溃的原因是实现细节并不重要,但是这是由于CLBeacon在您调用init时没有正确初始化。 当它解除分配时, CLBeacon解除引用它是_internal ivar,如果它是NULLCLBeacon崩溃。

你可以通过查看debugging器中的CLBeacon->_internal ivar的值来看到。 如果使用init创build信标,则ivar为NULL ,但是如果使用[[CLBeacon alloc] initWithCoder:nil]创build信标,它将会有一个值,并且在将信标设置为nil时不会崩溃。