Вопрос по objective-c – Библиотека Objective-C - не может сформировать слабую ссылку на экземпляр класса

10

В настоящее время я работаю с библиотекой 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 & quot; имею в виду? Ребята, вы знаете, как я могу это исправить? Я использовал более старую версию этого кода со Snow Leopard, и она сработала, Лев меня облажает!

Спасибо!

Ваш Ответ

3   ответа
20

Блог Майка ЭшаЯ нашел интересный абзац:

ARC's implementation of zeroing weak references requires close coordination between the Objective-C reference counting system and the zeroing weak reference system. This means that any class which overrides retain and release can't be the target of a zeroing weak reference. While this is uncommon, some Cocoa classes, like NSWindow, suffer from this limitation. Fortunately, if you hit one of these cases, you will know it immediately, as your program will crash with a message like this:

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

If you really must make a weak reference to classes such as these, you can use the __unsafe_unretained qualifier in place of __weak.

Вы включили ARC в своем приложении? Если вы выключите его, вы получите лучшие результаты?

рад, что смог помочь!
BRILLIANT !!! ВЫ СДЕЛАЛИ МОЙ НОЧНОЙ МАЙКЛ :) Это работает. Спасибо! objectiveccoder001
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
3

В моем проекте (как ошибка) была слабая ссылка наself вdealloc (это был отдельный метод, призванный очистить использованный ресурс). Использование слабой ссылки на одно свойство этого объекта (которое захватывало только ссылку на ресурс) решило проблему.

Действительно странно создавать слабую ссылку на полуразрушенный объект вdealloc.

NEVER WRITE LIKE THIS:

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

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

        [weakSelf.usedResource freeUsedMemory];
    });
}

Похожие вопросы