main()未在非并发NSOperation中调用

时间:2013-02-02 04:30:48

标签: objective-c nsoperation nsoperationqueue

创建NSOperation并将其放入NSOperationQueue时,我从未看到调用main()。只有start()被调用。我真的没有做任何奇特的事。作为一个简单的测试,我写了这个:

NSOperationQueue *testOperationQueue = [[NSOperationQueue alloc] init];
MyTestOperation *testOperation = [[MyTestOperation alloc] init];
[testOperationQueue addOperation:testOperation];

在MyTestOperation.m中:

- (void)main
{
  NSLog(@"testing if main is getting called");
}

- (void)start
{
  NSLog(@"testing if start is getting called");
}

MyTestOperation.h如下所示:

#import <Foundation/Foundation.h>

@interface MyTestOperation : NSOperation

@end

我错过了一些明显的东西吗?

[编辑注意:我实际上是指非并发,而不是并发(如前一个标题所述)。]

1 个答案:

答案 0 :(得分:7)

我玩了你的代码并注意到如果我完全注释掉你的start方法,那么main方法就会运行。在仔细阅读start的文档之后,我找到了这一行:

  

此方法的默认实现更新操作的执行状态,并调用接收方的main方法。

因此,通过使用未调用start的实现覆盖main,您实际上会使操作短路,并且永远不会允许它实际开始工作!因此,您需要在main方法中明确调用start,或者如果您实际上没有使用它来执行设置/更新执行状态,则需要将start全部消除在一起/等