11

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

谢谢!

4

3 回答 3

22

翻看Mike Ash 的博客,发现了一段有趣的段落:

ARC 对弱引用归零的实现需要 Objective-C 引用计数系统和归零弱引用系统之间的密切协调。这意味着任何覆盖保留和释放的类都不能成为归零弱引用的目标。虽然这并不常见,但一些 Cocoa 类,如 NSWindow,会受到这种限制。幸运的是,如果您遇到其中一种情况,您会立即知道,因为您的程序将崩溃并显示如下消息:

objc[2478]: cannot form weak reference to instance (0x10360f000) of class NSWindow

如果您确实必须对此类类进行弱引用,则可以使用 __unsafe_unretained 限定符代替 __weak。

你在你的应用程序中打开了 ARC 吗?如果你把它关掉,你会得到更好的结果吗?

于 2012-06-05T21:12:49.203 回答
7

在我的项目中(作为一个错误),对selfin的引用很弱dealloc(这是一个单独的方法,调用以清除使用的资源)。使用对该对象的一个​​属性的弱引用(仅捕获对资源的引用)解决了这个问题。

dealloc.

永远不要这样写:

- (void) dealloc
{
    [self freeUsedResource];
}

- (void) freeUsedResource
{
    __weak MyClass *weakSelf = self;
    dispatch_async(self.queue, ^{

        [weakSelf.usedResource freeUsedMemory];
    });
}
于 2016-12-05T10:18:51.913 回答
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
于 2012-06-06T07:11:20.160 回答