我有一个NSOperations
用于管理对 Web API 的服务调用的应用程序(这些调用基于Jon Wight 的 touchcode 中的 CURLOperation)。
当地图视图的中心发生显着变化时,有一个下载地图位置的调用;因为这些可以很快堆积起来,如果你移动地图,我会尝试积极取消过时的操作。它在 4.0 上运行良好。
但是,在 3.1 上,似乎在某些情况下操作队列将保留已取消(和已释放)的操作,当它到达它们应该在队列中的位置时会导致崩溃。
这是一个插图。
我从队列中一个相对重量级的服务调用开始:
MyLongRunningOp 0x1
用户导航到地图。队列现在看起来像这样:
MyLongRunningOp 0x1
MyMapOp 0x2
他们移动地图,取消 MyMapOp 0x2 并添加 MyMapOp 0x3:
MyLongRunningOp 0x1
MyMapOp 0x3
MyMapOp 0x2
现在已释放,因为它已从队列中删除。现在MyLongRunningOp 0x1
结束。在设置 isFinished 键的 KVO 回调中MyLongRunningOp
,我看到操作队列处理通知并尝试将其添加MyMapOp 0x2
到一些NSArray
. 自然,NSZombies
启用后,
[MyMapOp retain]: message sent to deallocated instance 0x2
似乎它以NSOperationQueue
某种方式挂在指向取消/释放操作的指针上,并在先前的操作完成后尝试激活它。
我无法在 4.0 上重现这种行为,所以我相信这是 3.1 的错误。
我在解决它时遇到了很多麻烦——据我所知,唯一的解决方法是永远不要取消我的操作,这会在网络变得不稳定时造成次优体验。
有没有其他人经历过这个?有任何想法吗?