【问题标题】:main() not called in non concurrent NSOperation非并发 NSOperation 中未调用 main()
【发布时间】:2013-02-02 04:30:48
【问题描述】:

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

我是否遗漏了一些明显的东西?

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

【问题讨论】:

  • MyTestOperation”的“@interface”.h 文件是什么样的?
  • 我已经包含了上面的 MyTestOperation.h。

标签: objective-c nsoperation nsoperationqueue


【解决方案1】:

我玩弄了你的代码,发现如果我完全注释掉你的start 方法,main 方法就会运行。在仔细阅读了start 的文档后,我发现了这一行:

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

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

【讨论】:

  • 是的。我尝试了同样的方法,只是覆盖了 main (left start() out),现在调用了 main。感谢您的澄清!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多