Cocoa 将NSOperation的自定义子类标记为已终止?

Cocoa 将NSOperation的自定义子类标记为已终止?,cocoa,key-value-observing,nsoperation,nsoperationqueue,Cocoa,Key Value Observing,Nsoperation,Nsoperationqueue,我已经创建了NSOperation的一个自定义子类,并覆盖了main方法 @interface WGTask : NSOperation @property(readonly) BOOL isExecuting,isFinished; @end @implementation WGTask @synthesize isExecuting,isFinished; - (void)start { ... [self willChangeValueForKey:@"isFinish

我已经创建了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_访问错误。删除
[self-didChangeValueForKey:@“isFinished”]
[self-willChangeValueForKey:@“isFinished”]
可以解决问题,但即使正确更新了
isFinished
值,NSOperationQueue也不会删除该操作

不要将iExecuting等创建为属性

从文档中:

如果要实现并发操作,则应重写此方法以返回操作的执行状态。如果确实覆盖了它,请确保在操作对象的执行状态发生更改时为isExecuting密钥路径生成KVO通知。有关手动生成KVO通知的更多信息,请参阅《键值观察编程指南》

实际上,您可能希望使用NSO操作的cancel语义

您也可以阅读

和(如果您使用这些标志进行依赖关系管理)


我的错。在调用
[self-willChangeValueForKey:@“isFinished”]
之前,我正在调用自定义子类的委托方法,在该方法中,我正在释放任务本身。这就是为什么我得到了EXC\u BAD\u访问错误,因为
self
已经不存在了。

谢谢你的回答,但是删除所有属性并覆盖
-(BOOL)是执行
,而
-(BOOL)是完成的
似乎不起作用。我仍然收到EXC_BAD_访问错误。也许我忘了什么。我是否必须实现一些其他方法才能使KVO正常工作?主要问题是操作队列在操作终止时没有收到通知。这可能有助于重新阅读几次以获得它(这也有帮助),但我最终发现我的视图是“自动删除”的,这就是为什么我获得了exc_bad_访问权限。