处理程序中未收到ios NSNotification

时间:2013-08-25 12:25:32

标签: ios nsnotificationcenter nsnotifications

我用它作为观察者:

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self
      selector:@selector(newConnection:)
       name:NSFileHandleConnectionAcceptedNotification
         object:nil];

虽然当应用程序崩溃时会收到此消息

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CALayerArray newConnection:]: unrecognized selector sent to instance 0x76aed70'

这是newConnection处理程序,当前为空:

- (void)newConnection:(NSNotification*)notification
{
}

它也正确地在.h文件中声明...

这是调用通知的代码

 socketPort = [[NSSocketPort alloc] initWithTCPPort:portNumber];
    int fd = [socketPort socket];
    fileHandle = [[NSFileHandle alloc] initWithFileDescriptor:fd
                                    closeOnDealloc:YES];
...
[fileHandle acceptConnectionInBackgroundAndNotify];

编辑: 以上整篇文章都是我上过的课。 除了newConnection之外的所有内容都在这个函数中:

- (id)initWithPortNumber:(int)pn delegate:(id)dl
{
if( self = [super init] ) {
...
}

我在viewController中调用了这个文件,如下所示:

    SimpleHTTPServer *server= [[SimpleHTTPServer alloc]initWithPortNumber:80 delegate:self];

解决方案:
问题是:视图因电弧系统而被释放[fileHandle acceptConnectionInBackgroundAndNotify];实际上并不是一个被检测到的循环,它将视图视为空闲并自动解除分配,所以我只是制作了一个小循环,每秒运行一个循环,导致一个空方法。修正了它。

2 个答案:

答案 0 :(得分:1)

它告诉你确切的错误是什么:'NSInvalidArgumentException', reason: '-[CALayerArray newConnection:]: unrecognized selector sent to instance 0x76aed70'

您需要问的问题是“为什么对象位于0x76aed70一个CALayerArray?”

首先介绍基础知识。在addObserver:…设置断点,确保self符合您的想法。然后设置一个跟踪指针,以便调试器在值改变时中断。你应该能够快速跟踪它。

我的猜测是你的对象已被释放,你没有删除观察者。

答案 1 :(得分:0)

问题是:由于电弧系统,视图被解除分配 [fileHandle acceptConnectionInBackgroundAndNotify];实际上并不是一个被检测到的循环,它将视图视为空闲并自动解除分配,所以我只是制作了一个小循环,每秒运行一个循环,导致一个空方法。修正了它。