2010-02-09 20 views
5

estoy pasando un objeto a un subproceso secundario usando el siguiente código:¿Cuándo liberar/retener un objeto que se pasa a un subproceso secundario?

(void)login:(id)sender 
{ 
    platformMsgs_LoginRequest *loginRequest = [[[platformMsgs_LoginRequest alloc] init] autorelease]; 
//more code... 
[NSThread detachNewThreadSelector:@selector(sendLoginRequest:) toTarget:self withObject:loginRequest]; 
//more code... 
} 

- (void)sendLoginRequest:(platformMsgs_LoginRequest *)loginRequest 
{ 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
[loginRequest retain]; 
NetSuiteBinding *binding = [NetSuiteServiceSvc NetSuiteBinding]; 
NetSuiteBindingResponse *response = [binding loginUsingParameters:loginRequest  applicationInfo:nil partnerInfo:nil]; 
[self performSelectorOnMainThread:@selector(loginOperationCompleted:) withObject:response waitUntilDone:NO]; 
[loginRequest release]; 
[pool drain]; 
} 

Mi pregunta es, ¿autorelease la forma correcta de manejar la liberación de este objeto ?. Una vez que se pasa al hilo secundario lo retengo y lo libero cuando ya no lo necesito.

Sin embargo, ¿es posible que la liberación automática libere el objeto antes de que el hilo secundario tenga la posibilidad de retenerlo ?. ¿Tengo que crear un ivar para esto ?, de modo que pueda liberar el objeto en performSelectorOnMainThread ?. Ya no necesito el objeto después del inicio de sesión, por lo que un ivar no parece ser el camino correcto. ¿Cuál es la mejor manera de manejar esto ?. Gracias.

-Oscar

Respuesta

5

La documentación para detachNewThreadSelector:toTarget:withObject: responde a su pregunta:

Los objetos aDestino y anArgument se conservan durante la ejecución del hilo individual, luego liberados.

Así que sí, puede liberar automáticamente el objeto o liberarlo explícitamente después de llamar a detachNewThreadSelector. Y no tiene que retener el objeto en el hilo secundario.

+0

Gracias, debería haber buscado en la documentación =). –

1

De los documentos.

detachNewThreadSelector: toTarget: withObject:

Los objetos aDestino y anArgument se retenido durante la ejecución de la rosca individual, luego liberados. Se sale del hilo separado (usando el método de clase de salida ) tan pronto como unTarget haya completado la ejecución del método aSelector .

Así que no es necesario que lo intentes con tanto esfuerzo. Autorelease está bien aquí, y no debería necesitar retenerlo en el hilo ya que el hilo conserva el argumento y el objetivo, y lo liberará cuando termine.

Cuestiones relacionadas