target c Тема в переменные времени жизни - PullRequest
1 голос
/ 04 июня 2011


У меня есть NSOperation, где внутри его -main-метода, который я использую [NSThread detachNewThreadSelector:@selector(aMethod:) toTarget:self withObject:anArgument];

aObject (переменная экземпляра моего подкласса NSOperation), является слабой ссылкой на объект автоматически возвращаемого массива, возвращенныйвнутри метода -main ...

-(void)main {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSArray *clients = [group produceClients]; // clients array is an autorelease instance
    self->aObject = [clients objectAtIndex:3]; // a weak reference, Lets say at index three!

    [NSThread detachNewThreadSelector:@selector(aMethod:) 
                             toTarget:self 
                           withObject:@"I use this for another thing"];

    // Do other things here that may take some time

    [pool release];
}

-(void)aMethod:(NSString*)aStr {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // aStr object is reserved for another functionality
    // I know that I could pass a NSDictionary with a number of entries, which would be
    // retained by `detachNewThreadSelector` but then ... 
    // I wouldn't have to ask this question ! :)

    // Do several things with aObject, which is a weak reference as described above.
    NSLog(@"%@", [self->aObject.id]);
    // Is it safe ?

    [pool release];
}

Я знаю, что метод detachNewThreadSelector в NSThread сохраняет self и withObject: anArgument, но что происходит с aObject ??Он уверен, что будет существовать во время выполнения отдельного потока (aMethod :)?Self сохраняется в detachNewThreadSelector, означает ли это, что пул потока -main будет отложен, поскольку он сохраняется, и, таким образом, clients будет существовать, и, таким образом, aObject будет существовать?
Или *Поток 1015 * (NSOperation) завершит выполнение и освободится до завершения -aMethod (NSThread), поэтому небезопасно использовать aObject там?

Реальный вопрос: при вызове [NSThread detachNewThreadSelector:@selector(aMethod:) ...toTarget:self ...] из потока,последний поток сохраняется таким образом, что его автоматически выпущенные экземпляры (массив clients) безопасны для использования в aMethod (self->aObject) (скажем, через слабые ссылки)?

1 Ответ

0 голосов
/ 04 июня 2011

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

-(void)main {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    [NSThread detachNewThreadSelector:@selector(aMethod:) 
                             toTarget:self 
                           withObject:@"I use this for another thing"];

    [pool release];
}

-(void)aMethod:(NSString*)aStr {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSArray *clients = [group produceClients]; // clients array is an autorelease instance
    self->aObject = [clients objectAtIndex:3]; // a weak reference, Lets say at index three!

    [pool release];
}

При таком подходе ваш массив клиентов находится в пуле автоматического выпуска потока.

...