Bueno, estoy trabajando en un proyecto que no es ARC, pero use Philipp Kyeck's socketio library que se escribe utilizando ARC. Estoy utilizando el método explicado en this fusionar proyecto no ARC y biblioteca ARC.Liberar un objeto en un proyecto que no sea ARC, el objeto se declara en una biblioteca ARC
En mi archivo ViewController Estoy inicialización del socket usando
SockIO *chatSockIO = [[SocketIO alloc] initWithDelegate:self];
y cuando necesito desconectar, me llaman
[chatSockIO disconnect];
que resulta método delegado socketIODidDisconnect al fuego.
- (void) socketIODidDisconnect:(SocketIO *)socket{
[chatSockIO release]; ==> is this call needed?
}
Ahora mi pregunta es sobre la línea [chatSockIO release]
. ¿Deberíamos liberar un objeto que está definido en modo ARC, pero que se usa en un proyecto que no es de ARC?
Ahora bien, cuando probé la versión, que tiene una excepción diciendo
-[SocketIO retain]: message sent to deallocated instance 0x6fec370
pero cuando me comentó que la línea, estoy consiguiendo una pérdida de memoria y dealloc en mi objeto de biblioteca no conseguir denominado en absoluto
Bounty Time !!
Olvide la biblioteca que mencioné, bloquee mi código y gotea .. ¿Cuál es la práctica habitual al usar un objeto definido mediante el método ARC, en un proyecto que no es ARC? ¿Debería solo asignarlo, o debería asignarlo y liberarlo después de su uso?
EDITAR: Un poco más de información.
Ejecuto zombie instrument en el crash, y esto es lo que tenía que decir .. Muestra la llamada para asignar y liberar funciones.
# Address Category Event Type RefCt Timestamp Size Responsible Library Responsible Caller
0 0x72d5da0 SocketIO Malloc 1 00:09.700.274 64 MyProject -[MyViewController sendRequestForSocketIOPush]
1 0x72d5da0 SocketIO Retain 2 00:09.700.317 0 MyProject -[SocketIO initWithDelegate:]
2 0x72d5da0 SocketIO Release 1 00:09.700.320 0 MyProject -[SocketIO initWithDelegate:]
3 0x72d5da0 SocketIO Retain 2 00:09.700.440 0 Foundation -[NSURLConnectionInternal initWithInfo:]
4 0x72d5da0 SocketIO Retain 3 00:10.413.717 0 Foundation -[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:]
5 0x72d5da0 SocketIO Release 2 00:10.413.761 0 Foundation -[NSURLConnectionInternalConnection invokeForDelegate:]
6 0x72d5da0 SocketIO Retain 3 00:10.413.797 0 Foundation -[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:]
7 0x72d5da0 SocketIO Release 2 00:10.413.811 0 Foundation -[NSURLConnectionInternalConnection invokeForDelegate:]
8 0x72d5da0 SocketIO Retain 3 00:10.413.816 0 Foundation -[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:]
9 0x72d5da0 SocketIO Release 2 00:10.415.087 0 Foundation -[NSURLConnectionInternalConnection invokeForDelegate:]
10 0x72d5da0 SocketIO Retain 3 00:10.415.214 0 Foundation -[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:]
11 0x72d5da0 SocketIO Release 2 00:10.415.216 0 Foundation -[NSURLConnectionInternalConnection invokeForDelegate:]
12 0x72d5da0 SocketIO Release 1 00:10.415.275 0 Foundation -[NSURLConnectionInternalConnection invokeForDelegate:]
13 0x72d5da0 SocketIO Retain 2 00:10.969.432 0 GraphicsServices GSEventRunModal
14 0x72d5da0 SocketIO Release 1 00:10.969.433 0 GraphicsServices GSEventRunModal
15 0x72d5da0 SocketIO Retain 2 00:10.969.434 0 GraphicsServices GSEventRunModal
16 0x72d5da0 SocketIO Release 1 00:10.969.456 0 GraphicsServices GSEventRunModal
17 0x72d5da0 SocketIO Retain 2 00:10.969.459 0 GraphicsServices GSEventRunModal
18 0x72d5da0 SocketIO Retain 3 00:10.969.488 0 Foundation -[NSCFTimer initWithFireDate:interval:target:selector:userInfo:repeats:]
19 0x72d5da0 SocketIO Release 2 00:10.976.115 0 MyProject -[SocketIO setTimeout]
20 0x72d5da0 SocketIO Retain 3 00:10.976.125 0 Foundation -[NSCFTimer initWithFireDate:interval:target:selector:userInfo:repeats:]
21 0x72d5da0 SocketIO Release 2 00:10.976.161 0 GraphicsServices GSEventRunModal
22 0x72d5da0 SocketIO Retain 3 00:13.935.328 0 GraphicsServices GSEventRunModal
23 0x72d5da0 SocketIO Release 2 00:13.935.373 0 MyProject -[SocketIO setTimeout]
24 0x72d5da0 SocketIO Retain 3 00:13.935.399 0 Foundation -[NSCFTimer initWithFireDate:interval:target:selector:userInfo:repeats:]
25 0x72d5da0 SocketIO Release 2 00:13.935.685 0 MyProject -[SocketIO onDisconnect]
26 0x72d5da0 SocketIO Release 1 00:13.935.705 0 MyProject -[MyViewController socketIODidDisconnect:]
27 0x72d5da0 SocketIO Release 0 00:13.935.716 0 GraphicsServices GSEventRunModal
28 0x72d5da0 SocketIO Zombie -1 00:13.936.298 0 GraphicsServices GSEventRunModal
No es necesario cambiar el archivo de clase ARC simplemente agregue '-fobjc-arc' en el indicador del compilador del archivo de clase – Sumanth
@Sumanth Desafortunadamente tengo una biblioteca escrita en ARC, y esa biblioteca usa 3 o 4 otras bibliotecas todas sigue a ARC. Este método de biblioteca estática es mejor en ese caso, supongo ... Además, incluso si clasifico todos mis archivos de clase ARC utilizando indicadores de compilación, estoy asignando y utilizando el objeto sockIO en mi archivo de proyecto, que está escrito en modo no ARC. Y si lo hago alocar/retener en un archivo que no sea ARC, debo liberarlo. – Krishnabhadra
http://blog.mugunthkumar.com/articles/migrating-your-code-to-objective-c-arc/ - este es realmente un gran tutorial sobre [mezclar] código ARC/no-ARC ¿También sabe de 'NS_RETURNS_NON_RETAINED' y' NS_RETURNS_RETAINED'? –