Когда освобождать / сохранять объект, который передается вторичному потоку? - PullRequest
5 голосов
/ 10 февраля 2010

Я передаю объект во вторичный поток, используя следующий код:

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

У меня такой вопрос, является ли авто-релиз верным способом справиться с выпуском этого объекта? Когда он передается во вторичный поток, я сохраняю его и освобождаю, когда он мне больше не нужен.

Однако возможно ли, что автоматическое освобождение освобождает объект до того, как вторичный поток сможет его сохранить? Нужно ли создавать для этого ивар ?, чтобы я мог освободить объект в executeSelectorOnMainThread ?. Я больше не нуждаюсь в объекте после входа в систему, поэтому ивару не кажется правильным путем. Каков наилучший способ справиться с этим? Спасибо.

-Oscar

Ответы [ 2 ]

5 голосов
/ 10 февраля 2010

Документация для detachNewThreadSelector:toTarget:withObject: отвечает на ваш вопрос:

Объекты aTarget и anArgument сохраняются во время выполнения отдельного потока, а затем освобождаются.

Так что да, вы можете автоматически высвобождать объект или освобождать его явно после вызова detachNewThreadSelector. И вам не нужно сохранять объект во вторичном потоке.

1 голос
/ 10 февраля 2010

Из документов.

detachNewThreadSelector: toTarget: withObject:

Объекты aTarget и anArgument сохраняется во время исполнения оторванная нить, затем отпущенная. отрывается нить (используя выйти из метода класса), как только aTarget завершил выполнение aSelector способ.

Так что вам не нужно стараться изо всех сил. С этим автоматическим выпуском все в порядке, и вам не нужно сохранять его в потоке, так как сам поток сохраняет аргумент и цель и освободит его по завершении.

...