我已经创建了NSOperation的自定义子类,并且我已经覆盖了main
方法。
@interface WGTask : NSOperation
@property(readonly) BOOL isExecuting,isFinished;
@end
@implementation WGTask
@synthesize isExecuting,isFinished;
- (void)start {
...
[self willChangeValueForKey:@"isFinished"];
isFinished=YES;
[self didChangeValueForKey:@"isFinished"];
...
}
@end
但是此代码引发了EXC_BAD_ACCESS错误。删除[self didChangeValueForKey:@"isFinished"]
和[self willChangeValueForKey:@"isFinished"]
可以解决问题,但即使isFinished
值已正确更新,NSOperationQueue也不会删除操作!
答案 0 :(得分:2)
我的错。在调用[self willChangeValueForKey:@"isFinished"]
之前,我正在调用自定义子类的委托方法,我在其中释放任务本身。这就是我收到EXC_BAD_ACCESS错误的原因,因为self
不再存在。
答案 1 :(得分:1)
不要将isExecuting等创建为属性
来自文档:
如果要实现并发操作,则应覆盖此方法以返回操作的执行状态。如果覆盖它,请确保每当操作对象的执行状态发生更改时,都会为isExecuting键路径生成KVO通知。有关手动生成KVO通知的详细信息,请参阅键值观察编程指南。
实际上,您可能想要使用NSOperation的取消语义
您可能还想阅读
NSoperation and key value observing
和(如果您使用这些标志进行依赖关系管理)