NSOperation dealloc не вызывается при отмене операции - PullRequest
2 голосов
/ 29 февраля 2012

Я использую NSOperation в моем приложении.Я отменяю ранее выполняемую операцию при создании другой операции.Но ранее созданный метод dealloc не вызывается при отмене этой операции.

Пожалуйста, предложите мне.Благодарю.

Ответы [ 2 ]

3 голосов
/ 29 сентября 2013

Я думаю, что вам нужно, чтобы isFinished вернул YES, а isExecuting вернул NO после отмены.В противном случае объект операции никогда не будет освобожден.

В документе указано.

Помимо простого выхода при отмене операции, также важно переместить отмененную операцию всоответствующее конечное состояние.В частности, если вы управляете значениями свойств isFinished и isExecuting самостоятельно (возможно, потому что вы реализуете параллельную операцию), вы должны соответствующим образом обновить эти переменные.В частности, вы должны изменить значение, возвращаемое isFinished, на YES, а значение, возвращаемое isExecuting, на NO.Вы должны внести эти изменения, даже если операция была отменена до ее начала.

1 голос
/ 29 февраля 2012

Это нормально:

Ответ на команду отмены

После добавления операции в очередь, операция выходит из Руки. Очередь вступает во владение и обрабатывает планирование этой задачи. Однако, если вы решите позже, что вы не хотите выполнять операция в конце концов - потому что пользователь нажал кнопку отмены в например, панель прогресса или выйдите из приложения - вы можете отменить операция, чтобы предотвратить ненужное использование процессорного времени. Ты сделаешь это путем вызова метода отмены самого объекта операции или вызов метода cancelAllOperations класса NSOperationQueue.

Отмена операции не заставляет ее немедленно остановить то, что она делается. Хотя уважение к значению, возвращаемому isCancelled, ожидается от всех операций , ваш код должен явно проверить значение возвращается этим методом и прерывается по мере необходимости. По умолчанию реализация NSOperation действительно включает в себя проверки на отмену. Например, если вы отмените операцию, прежде чем ее метод запуска вызванный метод start завершается без запуска задачи.

Метод dealloc будет вызван, когда счет сохранения объекта достигает нуля, увы, когда никакой другой объект не использует его.

...