2012-02-29 48 views
2

我在我的應用程序中使用NSOperation。 我在創建另一個操作時取消之前正在執行的操作。但是,在取消該操作時,以前創建的操作的dealloc方法不會調用。NSOperation dealloc在取消操作時未調用

請給我建議。 謝謝。

+0

沒有錯,除非'dealloc **從來沒有**被調用,取消操作並不意味着釋放它並釋放它並不意味着它應該被釋放 – 2012-02-29 04:33:20

回答

1

這只是罰款:

Responding to the Cancel Command

一旦你添加一個操作到隊列,操作是你的 手。隊列接管並處理該任務的調度。但是,如果您稍後決定完全不想執行 操作(例如,因爲用戶在 進度面板中按下了取消按鈕或退出應用程序),則可以取消 操作以阻止它消耗CPU時間不必要。您通過調用操作對象本身的取消方法或通過調用NSOperationQueue類的cancelAllOperations方法調用 來做 。

取消操作並不會立即強制停止它正在做的事情。雖然尊重由isCancelled返回的值爲 ,但所有操作的預期值爲,但您的代碼必須明確檢查此方法返回的值 並根據需要中止。 NSOperation的默認 確實包括檢查取消。 例如,如果您在啓動方法爲 之前取消操作,則start方法退出而不啓動任務。

dealloc方法將在對象的保留計數爲零時調用,當沒有其他對象正在使用它時。

+0

但我需要釋放當它被取消時的操作。因爲它需要大量的內存。 – Bharathi 2012-02-29 05:05:12

+0

您不應該調用dealloc,您應該定期在自定義代碼中檢查isCancelled屬性,並中止操作,清理空間並根據需要中止。 – 2012-02-29 05:26:35

3

我認爲你需要的是isFinished returns YES和isExecuting取消後返回NO。否則操作對象永遠不會被釋放。

文件說。

另外當操作被取消簡單地退出,這是 同樣重要的是您移動取消操作適當 最終狀態。特別是,如果您自己管理isFinished 的值並正在執行屬性(可能是因爲您在執行併發操作的 ),則必須相應地更新這些變量 。具體而言,您必須將由 isFinished返回的值更改爲YES,並將isExecuting返回的值更改爲NO。即使在 開始執行之前操作被取消,您也必須進行這些更改。