2

在创建 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

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

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

4

1 回答 1

7

我玩弄了您的代码,并注意到如果我完全注释掉您的start方法,该main方法将运行。在仔细阅读文档后start,我发现了这一行:

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

start因此,通过使用未调用的实现覆盖main,您有效地短路了操作,并且从未允许它实际开始工作!因此,您需要main在您的方法中显式调用,或者如果您实际上并未使用它来执行设置/更新执行状态/等,则start需要全部消除。start

于 2013-02-02T05:15:56.680 回答