2013-01-03 74 views
2

我在看一些旧的代码,看到下面的if语句:isMainThread和currentThread == mainThread有什么区别?

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

我暗自怀疑,这是不一样的

if (![[NSThread currentThread] isMainThread]) 

我怀疑,因为我们正在从字段中获取一些崩溃报告(仅iOS 6),这些报告似乎是由需要在主线程上运行的代码造成的。该代码似乎受到前if语句的保护,但鉴于我们看到的崩溃数量,我并不确信。

这两个if语句是否等价,还是有可能第一个会因为某种原因失败?

+1

最好的选择是使用类方法:'+ [NSThread isMainThread]'。这比您的代码更短,更清晰。 –

回答

1

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

该文档不保证返回的NSThread实例始终相同。一个假想的实现可能是:

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

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

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

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

我想确定这是否真的有机会修复崩溃,我无法重现。

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

+0

谢谢,这至少对我自己的理解是有帮助的。 – Mike

1

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

(在这里,如果+ [NSThread mainThread]是单身人士,那么他们真的有可能是相同的,但这是一个实现细节 - 即使它工作正常,您也不应该依赖它。)

+0

但理论上直接对象比较应该对我正在做的事很好,对吧?只有一个主线程,因此如果当前线程是主线程,则内存地址应该相同并通过测试。 – Mike

+1

@Mike号*实际上*直接对象比较可能没问题。但是*理论上*由于+ [NSThread currentThread]没有被记录为始终为同一个线程返回相同的实例,所以它被破坏了。 –

+0

如果有一个专用的'isMainThread',你应该使用它,因为不同的'NSThread'实例可能代表相同的底层线程。这可能并非如此,但如果他们给你这种方法,你应该使用它。 –