Objective-C Library - 不能形成对类实例的弱引用

时间:2012-06-05 21:07:17

标签: objective-c osx-lion

我目前正在使用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正在搞砸我!

谢谢!

3 个答案:

答案 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