Quickblox:我在加入/离开聊天室时收到EXC_BAD_ACCESS(代码= 1,地址“mem-address”)

时间:2014-11-30 08:11:59

标签: ios objective-c swift quickblox dealloc

嘿所以标题提供了一些信息,但让我进一步扩展。在我的iOS应用程序中,当我加入并快速离开聊天室时,我收到此EXC_BAD_ACCESS消息(通过选择UITableView中的线程并将视图推送到新的UIViewController然后弹回UITableViewController)。我试图解决这个问题,因为它更慢,网络连接速度更快,我想避免崩溃。我使用基于sample-chat xcode项目中的ChatService.h / .m文件的Quickblox Chat服务。这是唯一修改过的代码:

- (void)chatRoomDidEnter:(QBChatRoom *)room{
    if (self.joinRoomCompletionBlock) {
        self.joinRoomCompletionBlock(room);
        self.joinRoomCompletionBlock = nil;
    }

    [[NSNotificationCenter defaultCenter] postNotificationName:@"kNotificationChatRoomDidEnter"
                                                    object:nil userInfo:nil];
}

崩溃发生在此方法的最后,当我打开NSZombies时,我收到此错误消息:

*** -[QBChatRoom retain]: message sent to deallocated instance 0x15e6bbe0

我实际上在我的UIViewController的viewWillAppear / Disappear方法(用Swift编写)中从ChatService调用这些方法:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.chatRoom = self.dialog.chatRoom
    ChatService.instance().joinRoom(self.chatRoom, completionBlock: { (joinedChatRoom : QBChatRoom!) -> Void in
        //joined
    })
}

override func viewWillDisappear(animated: Bool)  {
    super.viewWillDisappear(animated)

    let notificationCenter = NSNotificationCenter.defaultCenter()
    notificationCenter.removeObserver(self);

    if (self.chatRoom != nil) {
        ChatService.instance().leaveRoom(self.chatRoom);
        self.chatRoom = nil
    }
}

提前感谢您对此问题的任何见解。

1 个答案:

答案 0 :(得分:0)

我还没有使用Swift的经验,但我猜是

ChatService.instance().joinRoom(self.chatRoom, completionBlock:{...})

是异步的(因此是完成块)并且不保留self.chatRoom。

当你描述的事情很快时,首先调用viewWillDisappear,并且self.chatRoom变为nil。之后,调用完成块并且" room" (或self.chatRoom)试图保留,但为时已晚。

self.chatRoom在调用完成块之前被释放,因此你拥有了你的僵尸。

ChatService中是否存在某种中止调用?