isMainThread和currentThread == mainThread有什么区别?

时间:2013-01-03 15:26:59

标签: ios nsthread

我正在查看一些旧代码,并看到以下if语句:

if ([NSThread currentThread] != [NSThread mainThread])

我怀疑这与

不一样
if (![[NSThread currentThread] isMainThread])

我很怀疑,因为我们从字段中获得了一些崩溃报告(仅限iOS 6),这些报告似乎是由需要在主线程上运行的代码引起的。代码似乎受到前if语句的保护,但考虑到我们看到的崩溃次数,我不相信。

两个if语句是否相同,或者第一个语句是否可能由于某种原因而失败?

2 个答案:

答案 0 :(得分:1)

这可能相同也可能不相同 - 使用!=对象的比较结果通常没有记录。由于它是直接指针比较,因此仅对完全相同的对象返回true,而不是逻辑等效的情况。这就是为什么你应该总是使用他们专用的相等和比较方法来比较对象。

(在这里,如果+ [NSThread mainThread]是一个单身人士,你很有可能他们是一样的,但这是一个实施细节 - 你不应该依赖它,即使它有效/似乎有效。)

答案 1 :(得分:1)

  

[NSThread currentThread]如何返回一个不同的实例   同一个线程?

文档不保证返回的NSThread实例始终相同。假设的实施可能是:

+ (NSThread *)currentThread {
    return [[NSThread alloc] initWithPrivateIdentifier:pthread_self()];
}

实际实现不太可能像这样工作。我的直觉甚至表示比较实例身份是安全的 - 但文档不支持这一点。

  

给定线程是否可能有多个实例?

文档没有说明相反的情况。所以,是的,它至少是可以想象的。

  

我正在试图确定这是否真的有机会修复我无法重现的崩溃。

实际上,在实践中,我怀疑[NSThread currentThread] != [NSThread mainThread]+[NSThread isMainThread]不同,但这只是我的感受。