У меня есть 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
) (скажем, через слабые ссылки)?