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

2019-07-29 18:23发布

我目前正在与XMPP图书馆工作的Objective-C,和我使用“桌面”的示例代码。

它记录的罚款; 然而,当我打开一个新的聊天,或有人向我发送一个消息,它崩溃。

这似乎是哪里出了问题:

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的”呢? 难道你们知道我该如何解决? 我用这个代码与雪豹的旧版本,它的工作,狮子被拧紧我!

谢谢!

Answer 1:

看着迈克灰的博客 ,我发现一个有趣的段落:

ARC的实现零弱引用的需要Objective-C的引用计数系统和零弱引用系统之间的密切配合。 这意味着,它覆盖保持和释放的任何类不能是零弱引用的目标。 虽然这种情况并不常见,一些Cocoa类,像NSWindow,受这种限制。 幸运的是,如果你打的这些情况之一,你会立刻知道它,因为你的程序将与这样的消息崩溃:

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

如果你必须做一个弱引用类,如这些,你可以在地方__weak的使用__unsafe_unretained预选赛。

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



Answer 2:

在我的项目(如一个错误)有一个弱引用selfdealloc (这是一个单独的方法,叫做以清除使用的资源)。 使用弱引用此对象的一个​​属性(即捕获只是一个资源引用)解决了这个问题。

这是很奇怪的创造弱引用半销毁的对象dealloc

从来不写这样的:

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

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

        [weakSelf.usedResource freeUsedMemory];
    });
}


Answer 3:

请记住,你需要评两个地方。

@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


文章来源: Objective-C Library - cannot form weak reference to instance of class