为什么取消所有操作不会删除所有操作?

Sep*_*gus 1 objective-c

[oqlMyOperationQueue cancelAllOperations];

PO([oqlMyOperationQueue operations]);
Run Code Online (Sandbox Code Playgroud)

我仍然在那里看到一堆操作.

2013-05-06 16:05:38.559  [oqlMyOperationQueue operations]: (
    "<NSBlockOperation: 0x20222730>",
    "<NSBlockOperation: 0x2041f7a0>",
    "<NSBlockOperation: 0x20450830>",
    "<NSBlockOperation: 0x20417bf0>",
    "<NSBlockOperation: 0x2006d510>",
    "<NSBlockOperation: 0x2000d150>",
    "<NSBlockOperation: 0x20379810>",
    "<NSBlockOperation: 0x2021f8f0>",
    "<NSBlockOperation: 0x2045dca0>",
    "<NSBlockOperation: 0x2024c670>",
    "<NSBlockOperation: 0x2041b8e0>",
    "<NSBlockOperation: 0x203d54a0>",
    "<NSBlockOperation: 0x20442c80>",
    "<NSBlockOperation: 0x20452930>",
    "<NSBlockOperation: 0x20363af0>"
)
Run Code Online (Sandbox Code Playgroud)

但是我取消了所有的操作.所以有什么问题?

好的,我知道如果一个操作已经执行,它将保留在队列中.但是为什么还有这么多呢?队列是串行的.

Jus*_*Sid 5

引用NSOperationQueue文档:

此方法向队列中当前的所有操作发送取消消息.排队操作在开始执行之前被取消.如果操作已在执行,则由该操作识别取消并停止其正在执行的操作.

cancelAllOperations不清除队列,而是通知队列中当前所有取消它们的操作.进一步引用文档(强调我的):

添加后,您无法直接从队列中删除操作.操作将保留在其队列中,直到它报告已完成其任务.完成其任务并不一定意味着操作执行该任务完成.也可以取消操作.取消操作对象会将对象留在队列中,但会通知对象它应该尽快中止其任务.