在此代码片段中使用NSThread

时间:2012-01-26 08:40:57

标签: iphone ios nsthread

我正在处理别人的代码。我遇到了一行代码

[NSThread detachNewThreadSelector:@selector(myMethod) toTarget:self withObject:nil];

我有两个问题要问。

  1. 它只是调用一种方法。为什么NSThread在这里使用?
  2. 在运行代码时,在某些情况下,不会调用此方法。当我在方法中放置断点时,它总是被调用。但是如果我删除断点,在某些情况下该方法不会被调用。这是NSThread的问题吗?

2 个答案:

答案 0 :(得分:3)

以这种方式使用NSThread意味着在后台线程上调用方法“myMethod”,与其余代码同时进行。它等同于你,你可能也看到过:

[self performSelectorInBackground:@selector(myMethod) withObject:nil];

如果没有调用该方法(或者似乎没有被调用),则可能是并发问题,即该方法的执行顺序和您在主线程上调用之后的执行顺序无法保证,所以你期望它早于实际调用。

如果你说:

[NSThread detachNewThreadSelector:@selector(methodA) toTarget:self withObject:nil];
[self methodB];

然后methodA和methodB将同时运行 ,并且无法保证methodA将在methodB之前完成。

答案 1 :(得分:2)

我总是将NSThread detachNewThreadSelector与自动发布池结合使用,如下所示:

  -(void)myMethod {
      NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init];
      // .. Do stuff in this thread
      [pool release];
  };

如果您想“简单地”执行选择器,请执行以下操作:

  [self performSelector:@selector(myMethod)];