Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么发布通知会导致崩溃?_Ios_Objective C_Game Center_Gamekit_Nsnotificationcenter - Fatal编程技术网

Ios 为什么发布通知会导致崩溃?

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

我使用以下代码发布通知,但它在EXC_BAD_访问时崩溃:

[[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
    }
}