2010-02-09 7 views
5

ich ein Objekt zu einem sekundären Thread bin vorbei mit dem folgenden Code:Wann soll ein Objekt freigegeben/behalten werden, das an einen sekundären Thread übergeben wird?

(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]; 
} 

Meine Frage ist, Autofreigabe der richtige Weg ist, die Freigabe dieses Objekts zu behandeln ?. Sobald es an den sekundären Thread übergeben wurde, behalte ich es und gebe es frei, wenn ich es nicht mehr brauche.

Allerdings ist es möglich, dass die Autorelease, das Objekt freigibt, bevor der sekundäre Thread eine Chance hat, es zu behalten ?. Muss ich dafür einen ivar anlegen, damit ich das Objekt im performSelectorOnMainThread freigeben kann? Ich brauche das Objekt nach dem Login nicht mehr, also scheint ein ivar nicht der richtige Weg zu sein. Was ist der beste Weg, damit umzugehen? Vielen Dank.

-Oscar

Antwort

5

Die Dokumentation für detachNewThreadSelector:toTarget:withObject: beantwortet Ihre Frage:

Die Objekte atarget und anArgument werden während der Ausführung des abgelösten Faden beibehalten, dann freigelassen.

Ja, Sie können das Objekt automatisch freigeben oder nach dem Aufruf von detachNewThreadSelector explizit freigeben. Und Sie müssen das Objekt im sekundären Thread nicht beibehalten.

+0

Vielen Dank, hätte in der Dokumentation nachgeschaut =). –

1

Aus der Dokumentation.

detachNewThreadSelector: toTarget: withobject:

Die Objekte atarget und anArgument während der Ausführung des frei stehende Faden zurückgehalten werden, dann freigelassen. Der gelöste Thread wird beendet (unter Verwendung der Exitklassenmethode ), sobald ein Ziel die Ausführung der Methode aSelector abgeschlossen hat.

Sie müssen nicht so hart versuchen. Autorelease ist hier in Ordnung, und Sie sollten es nicht im Thread behalten müssen, da der Thread selbst das Argument und das Ziel beibehält und nach dem Beenden wieder freigibt.

Verwandte Themen