Я испытываю ошибку EXC_BAD_ACCESS
внутри своего приложения в блоке, который, насколько я понимаю, должен фактически фиксировать все, что связано с этим, что делает невозможным его выпуск внутри блока. (ARC включен)
Вот мой код:
- (void)_perform_async_onqueue:(void (^)(void))task {
dispatch_async(self.workerQueue, task);
}
- (void)cancel {
[self _perform_async_onqueue:^{
// operation is strongly retained by self.
// operation is also retained by an operation queue.
// within `cancel` the operation is released from the operation queue
[self.operation cancel];
}
}];
Это падает внутри [self.operation cancel]
. self.operation
является подклассом NSOperation
. Метод операции cancel
в деталях:
- (void)cancel {
[self willChangeValueForKey:@"isCancelled"];
_cancelled = YES;
[self didChangeValueForKey:@"isCancelled"];
[self willChangeValueForKey:@"isFinished"];
[self willChangeValueForKey:@"isExecuting"];
_finished = YES;
_executing = NO;
[self didChangeValueForKey:@"isExecuting"];
[self didChangeValueForKey:@"isFinished"]; // CRASH (debugger lists `self` [= the operation] as `nil` in this line
}
Насколько я понимаю, первый self
должен оставаться внутри отправленного блока. Поскольку self
имеет ссылку strong
на operation
, она также должна находиться в памяти до конца выполнения блока. Как это может привести к сбою EXC_BAD_ACCESS
?
nil
. Я не могу сломаться там, так как это происходит только время от времени. Если бы она сталаnil
перед строкой, эта строка не должна ничего делать, так как сообщение было бы отправлено наnil
, верно? 22.09.2015AFNetworking
в качестве примера при реализации операции. 22.09.2015