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 参照カウント システムと弱い参照をゼロにするシステムとの間の緊密な調整が必要です。これは、retain と release をオーバーライドするクラスは、ゼロ化の弱参照の対象にならないことを意味します。これは一般的ではありませんが、NSWindow などの一部の Cocoa クラスには、この制限があります。幸いなことに、これらのケースのいずれかに遭遇した場合、プログラムは次のようなメッセージでクラッシュするため、すぐにわかります。

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

これらのクラスへの弱い参照を作成する必要がある場合は、__weak の代わりに __unsafe_unretained 修飾子を使用できます。

アプリで ARC をオンにしましたか? オフにすると、より良い結果が得られますか?

于 2012-06-05T21:12:49.203 に答える
7

私のプロジェクトでは(間違いとして)selfinへの弱い参照がありましたdealloc(使用済みリソースをクリアするために呼び出される別のメソッドでした)。このオブジェクトの 1 つのプロパティ (リソースへの参照のみをキャプチャしたもの) への弱い参照を使用すると、問題が解決しました。

で半分破壊されたオブジェクトへの弱い参照を作成するのは本当に奇妙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

2 か所にコメントする必要があることに注意してください。

@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 に答える