Ios 为什么发布通知会导致崩溃?
我使用以下代码发布通知,但它在EXC_BAD_访问时崩溃:Ios 为什么发布通知会导致崩溃?,ios,objective-c,game-center,gamekit,nsnotificationcenter,Ios,Objective C,Game Center,Gamekit,Nsnotificationcenter,我使用以下代码发布通知,但它在EXC_BAD_访问时崩溃: [[NSNotificationCenter defaultCenter]postNotificationName:AUTHENTICATED_NOTIFICATION object:nil]; 在my constants.h文件中: #import <Foundation/Foundation.h> extern NSString *const PLAYER_ID; extern NSString *const RAN
[[NSNotificationCenter defaultCenter]postNotificationName:AUTHENTICATED_NOTIFICATION object:nil];
在my constants.h文件中:
#import <Foundation/Foundation.h>
extern NSString *const PLAYER_ID;
extern NSString *const RANDOM_NUMBER;
extern NSString *const AUTHENTICATED_NOTIFICATION;
extern NSString *const UNAUTHENTICATED_NOTIFICATION;
@interface RIYConstants : NSObject
{
}
@end
崩溃的方法是在game center进行身份验证时调用的处理程序:
-(void)authenticatedPlayer:(GKLocalPlayer*)localPlayer
{
[[NSNotificationCenter defaultCenter]postNotificationName:AUTHENTICATED_NOTIFICATION object:nil];
......
}
我不知道它为什么会崩溃。它不会在每次发布通知时崩溃(似乎是随机的)
编辑:
只有一个对象注册以接收通知。下面是init方法和调用的选择器。我不认为有什么会导致这次撞车。_label和_joinGame都是SKLabelNodes
-(id)init
{ ...
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(addGameCenterOption) name:AUTHENTICATED_NOTIFICATION object:nil];
...
}
-(void)addGameCenterOption
{
_label.text = @"";
_joinGame.text = @"Start multiplayer game";
_signedIn = YES;
}
编辑:我已经更改了应用程序,因此没有注册任何对象来观察通知,但它仍然会崩溃(随机)。由于您正在修改UI元素,请在addGameCenterOption的开头添加断言,以确保您处于主线程上。此外,在与元素交互之前,请执行一些间接操作,例如在设置任何属性之前,记录它们的类以验证它们是否仍然存在
如果设置了异常断点(左窗格),Xcode应该显示导致崩溃的确切行。这很可能是由已注册的观察者引起的,该观察者在发送通知时已被释放,但观察者没有注销 确保添加观察者的所有类:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(addGameCenterOption) name:AUTHENTICATED_NOTIFICATION object:nil];
在释放观察者之前,请务必移除观察者:
[[NSNotificationCenter defaultCenter] removeObserver:self AUTHENTICATED_NOTIFICATION object:nil];
对我来说,这是因为选择器的函数签名不正确。我指定了一个没有参数的选择器:
#选择器(MyClass.myFunc)
但该方法的定义如下:
class MyClass {
...
@objc func myFunc(completion: (() -> ())?)
// function body
}
}
在意识到选择器不允许使用此签名后,我像这样更新了代码
class MyClass {
...
@objc func functionForMySelector() {
myFunc(completion: nil)
}
func myFunc(completion: (() -> ())?)
// function body
}
}
并这样定义了我的选择器:
#selector(MyClass.functionForMySelector)
其他对象是否已注册以接收此通知,而不是在取消注册之前取消注册?只有一个对象已注册以观察此事件,在应用程序的生命周期内,它从未被解除分配。您收到了什么崩溃消息?EXC_BAD_ACCESS(code=1,address=0xB14595D5)您确定它没有在通知处理程序中崩溃吗?只有一个对象注册为侦听,并且它从未被释放。
class MyClass {
...
@objc func functionForMySelector() {
myFunc(completion: nil)
}
func myFunc(completion: (() -> ())?)
// function body
}
}