ОБНОВЛЕНИЕ: Когда я делаю это, инструменты показывают много утечек. Действовать осторожно! Я держу это здесь на случай, если я действительно что-то найду, и кто-то еще сможет понять, как преодолеть препятствие утечки.
Вот извращенная идея, которую я повторяю, когда печатаю это:
Установите операцию как объект для метода initWithTarget:selector:object: NSInvocationOperation. Предположим, что у вас уже есть NSOperationQueue (назовем ее queue):
NSInvocationOperation *operation = [NSInvocationOperation alloc];
operation = [operation initWithTarget:self selector:@selector(myOperation:) object:operation];
[queue addOperation:operation];
[operation release];
Обратите внимание, что нам нужно разбить alloc на отдельный вызов. В противном случае мы не сможем установить для object операцию!
Затем в методе операции верните объект обратно и добавьте проверки для isCancelled по желанию. Например:
- (void)myOperation:(id)object {
NSInvocationOperation *operation = (NSInvocationOperation *)object;
if ([operation isCancelled]) return;
...
}
Убедитесь, что ваш селектор заканчивается двоеточием в вызове initWithTarget:..., так как теперь вы будете передавать объект.
Все идет нормально. Теперь, если я смогу принудительно выполнить cancelAllOperations, я узнаю, действительно ли это работает. :)
person
Joe D'Andrea
schedule
11.08.2009