2

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

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

我有一个偷偷摸摸的怀疑,这不一样

if (![[NSThread currentThread] isMainThread])

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

上面的两个 if 语句是否等效,或者第一个语句是否可能由于某种原因而失败?

4

2 回答 2

1

这可能相同也可能不同 - 使用对象的比较结果!=通常没有记录。因为它是一个直接的指针比较,它只会对完全相同的对象返回 true,而不是在逻辑等价的情况下。这就是为什么您应该始终使用它们专用的相等和比较方法来比较对象。

(在这里,你很有可能它们是相同的,以防+ [NSThread mainThread]是单例,但这是一个实现细节——你不应该依赖它,即使它有效/似乎有效。)

于 2013-01-03T15:31:04.463 回答
1

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

文档不保证返回的NSThread实例总是相同的。一个假设的实现可能是:

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

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

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

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

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

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

于 2013-01-03T16:01:44.740 回答