问题描述
在将设置为 nil 。
CLBeacon * beacon = [[CLBeacon分配]在里面];
beacon = nil; //崩溃
是否不可能取消分配已初始化的 CLBeacon
?
只需将上面的代码添加到App Delegate的中的一个新项目中,即可复制此代码didFinishLaunchingWithOptions
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
CLBeacon * beacon = [[CLBeacon alloc] init];
beacon = nil; //崩溃
返回YES;
}
状态:
崩溃的原因是实现细节,实际上并不重要,但是这是由于当您仅调用 init
时 CLBeacon
s没有正确初始化的事实。取消分配时, CLBeacon
取消引用它的 _internal
ivar,如果它为 NULL $,则崩溃。 c $ c>。
您可以通过查看 CLBeacon-> _ internal
ivar的值来查看在调试器中。如果使用 init
创建信标,则ivar为 NULL
,但是如果使用 [[[CLBeacon alloc] initWithCoder:nil] ,它将具有一个值,并且在将信标设置为 nil
时不会崩溃。 / p>
The following will perform a crash when setting CLBeacon to nil
.
CLBeacon *beacon = [[CLBeacon alloc] init];
beacon = nil; // crash
Is it not possible to deallocate an initialized CLBeacon
?
This can be reproduced by simply adding the code above to a fresh project inside the App Delegate's didFinishLaunchingWithOptions
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
CLBeacon *beacon = [[CLBeacon alloc] init];
beacon = nil; // crash
return YES;
}
The apple documentation for CLBeacon states:
The reason it crashes is an implementation detail that doesn't really matter, but it is due to the fact that CLBeacon
s are not properly initialized when you just call init
. When it deallocates, CLBeacon
dereferences it's _internal
ivar and crashes if it is NULL
.
You can see this by looking at the value of the CLBeacon->_internal
ivar in the debugger. If you create the beacon using init
then the ivar is NULL
, but if you create it with [[CLBeacon alloc] initWithCoder:nil]
it will have a value and it doesn't crash when you set the beacon to nil
.
这篇关于将CLBeacon设置为nil时为EXC_BAD_ACCESS的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!