我目前正在使用Objective-C的XMPP库,我正在使用“桌面”示例代码。
它登录很好;但是,当我打开一个新聊天,或者有人给我发消息时,它会崩溃。
这似乎出现了问题:
XMPPStream[11678:1b03] RECV:
2012-06-05 15:03:59:379 XMPPStream[11678:1b03] RECV:
2012-06-05 15:03:59:382 XMPPStream[11678:403] RosterController: xmppRosterDidChange:
2012-06-05 15:03:59:387 XMPPStream[11678:403] RosterController: xmppRosterDidChange:
2012-06-05 15:04:01:900 XMPPStream[11678:403] tableView:shouldEditTableColumn:"jid" row:0
2012-06-05 15:04:01:900 XMPPStream[11678:403] user:
objc[11678]: cannot form weak reference to instance (0x7fcd4a498930) of class ChatController
和
objc[11998]: cannot form weak reference to instance (0x7f853bd17c70) of class ChatController
(lldb)
(lldb)
“无法形成对ChatController类的实例的弱引用”是什么意思?你们知道我怎么解决它吗?我在Snow Leopard上使用了这个代码的旧版本,它起作用了,Lion正在搞砸我!
谢谢!
答案 0 :(得分:20)
看Mike Ash's blog,我发现了一个有趣的段落:
ARC实施归零弱引用需要关闭 Objective-C引用计数系统与 归零弱参考系统。这意味着任何类别 覆盖保留和释放不能成为归零弱的目标 参考。虽然这种情况并不常见,但有一些Cocoa类,如NSWindow, 遭受这种限制。幸运的是,如果你击中其中一个 在这种情况下,你会立即知道它,因为你的程序会崩溃 像这样的消息:
objc[2478]: cannot form weak reference to instance (0x10360f000) of class NSWindow
如果你真的必须对这些类进行弱引用,那么你 可以使用__unsafe_unretained限定符代替__weak。
您是否在应用中启用了ARC?如果你把它关掉,你会得到更好的结果吗?
答案 1 :(得分:4)
在我的项目中(作为一个错误),self
中有dealloc
的弱引用(它是一个单独的方法,被称为清除已使用的资源)。
使用对该对象的一个属性的弱引用(仅捕获对资源的引用)解决了该问题。
在dealloc
中创建对半毁坏对象的弱引用真的很奇怪。
- (void) dealloc
{
[self freeUsedResource];
}
- (void) freeUsedResource
{
__weak MyClass *weakSelf = self;
dispatch_async(self.queue, ^{
[weakSelf.usedResource freeUsedMemory];
});
}
答案 2 :(得分:1)
请记住,你需要评论两个地方。
@interface GCDMulticastDelegateNode : NSObject
{
//#if __has_feature(objc_arc_weak)
//__weak id delegate;
//#else
__unsafe_unretained id delegate;
//#endif
dispatch_queue_t delegateQueue;
}
- (id)initWithDelegate:(id)delegate delegateQueue:(dispatch_queue_t)delegateQueue;
//#if __has_feature(objc_arc_weak)
//@property (/* atomic */ readwrite, weak) id delegate;
//#else
@property (/* atomic */ readwrite, unsafe_unretained) id delegate;
//#endif
@property (nonatomic, readonly) dispatch_queue_t delegateQueue;
@end