2012-06-05 8 views
10

Actualmente estoy trabajando con la biblioteca XMPP para Objective-C, y estoy usando el código de ejemplo "Desktop".Biblioteca Objective-C: no se puede formar una referencia débil a la instancia de la clase

Inicia sesión bien; sin embargo, cuando abro un nuevo chat, o alguien me envía un mensaje, se bloquea.

Esto parece que algo va mal:

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 

y

objc[11998]: cannot form weak reference to instance (0x7f853bd17c70) of class ChatController 
(lldb) 
(lldb) 

¿Qué significa "no puede formar débil referencia a la instancia .... ChatController de clase" significa? ¿Ustedes saben cómo puedo arreglarlo? Utilicé una versión anterior de este código con Snow Leopard y funcionó, ¡Lion me está fastidiando!

¡Gracias!

Respuesta

20

En cuanto a Mike Ash's blog, he encontrado un interesante párrafo:

aplicación de la reducción a cero referencias débiles de ARC requiere una estrecha coordinación entre el sistema de recuento de referencias de Objective-C y la puesta a cero del sistema de referencia débil . Esto significa que cualquier clase que anule y retenga no puede ser el objetivo de una referencia de puesta a cero débil. Si bien esto no es común, algunas clases de Cocoa, como NSWindow, adolecen de esta limitación. Afortunadamente, si se golpea uno de estos casos, usted lo sabrá inmediatamente, ya que su programa se bloqueará con un mensaje así:

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

Si realmente tiene que hacer una referencia débil a las clases de este tipo, puede usar el calificador __unsafe_unretained en lugar de __weak.

¿Ha activado ARC en su aplicación? Si lo apagas, ¿obtienes mejores resultados?

+0

BRILLANTE !!! HICISTE MI NOCHE MICHAEL :) Funciona. ¡Gracias! – objectiveccoder001

+0

me alegro de poder ayudar! –

1

recuerde que necesita comentar dos lugares.

@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 
2

En mi proyecto (como un error) hubo una débil referencia a self en dealloc (era un método separado, llamado a borrar recurso utilizado). El uso de una referencia débil a una propiedad de este objeto (que capturó solo una referencia al recurso) resolvió el problema.

Es realmente extraño crear una referencia débil al objeto medio destruido en dealloc.

NUNCA escribe así:

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

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

     [weakSelf.usedResource freeUsedMemory]; 
    }); 
} 
Cuestiones relacionadas