嘿所以标题提供了一些信息,但让我进一步扩展。在我的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
}
}
提前感谢您对此问题的任何见解。
答案 0 :(得分:0)
我还没有使用Swift的经验,但我猜是
ChatService.instance().joinRoom(self.chatRoom, completionBlock:{...})
是异步的(因此是完成块)并且不保留self.chatRoom。
当你描述的事情很快时,首先调用viewWillDisappear,并且self.chatRoom变为nil。之后,调用完成块并且" room" (或self.chatRoom)试图保留,但为时已晚。
self.chatRoom在调用完成块之前被释放,因此你拥有了你的僵尸。
ChatService中是否存在某种中止调用?