我目前正在与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的”呢? 难道你们知道我该如何解决? 我用这个代码与雪豹的旧版本,它的工作,狮子被拧紧我!
谢谢!
看着迈克灰的博客 ,我发现一个有趣的段落:
ARC的实现零弱引用的需要Objective-C的引用计数系统和零弱引用系统之间的密切配合。 这意味着,它覆盖保持和释放的任何类不能是零弱引用的目标。 虽然这种情况并不常见,一些Cocoa类,像NSWindow,受这种限制。 幸运的是,如果你打的这些情况之一,你会立刻知道它,因为你的程序将与这样的消息崩溃:
objc[2478]: cannot form weak reference to instance (0x10360f000) of class NSWindow
如果你必须做一个弱引用类,如这些,你可以在地方__weak的使用__unsafe_unretained预选赛。
你在你的应用程序打开ARC上? 如果你把它关掉,你得到更好的结果?
在我的项目(如一个错误)有一个弱引用self
在dealloc
(这是一个单独的方法,叫做以清除使用的资源)。 使用弱引用此对象的一个属性(即捕获只是一个资源引用)解决了这个问题。
这是很奇怪的创造弱引用半销毁的对象dealloc
。
从来不写这样的:
- (void) dealloc
{
[self freeUsedResource];
}
- (void) freeUsedResource
{
__weak MyClass *weakSelf = self;
dispatch_async(self.queue, ^{
[weakSelf.usedResource freeUsedMemory];
});
}
请记住,你需要评两个地方。
@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