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

时间:2011-09-02 15:33:22

标签: 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:@"isFinished"];
    isFinished=YES;
    [self didChangeValueForKey:@"isFinished"];
    ...
}
@end

但是此代码引发了EXC_BAD_ACCESS错误。删除[self didChangeValueForKey:@"isFinished"][self willChangeValueForKey:@"isFinished"]可以解决问题,但即使isFinished值已正确更新,NSOperationQueue也不会删除操作!

2 个答案:

答案 0 :(得分:2)

我的错。在调用[self willChangeValueForKey:@"isFinished"]之前,我正在调用自定义子类的委托方法,我在其中释放任务本身。这就是我收到EXC_BAD_ACCESS错误的原因,因为self不再存在。

答案 1 :(得分:1)

不要将isExecuting等创建为属性

来自文档:

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

实际上,您可能想要使用NSOperation的取消语义

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html

您可能还想阅读

NSoperation and key value observing

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

NSOperation KVO problem