Ios 什么';isMainThread和currentThread==mainThread之间的区别是什么?
我正在查看一些旧代码,并看到以下if语句:Ios 什么';isMainThread和currentThread==mainThread之间的区别是什么?,ios,nsthread,Ios,Nsthread,我正在查看一些旧代码,并看到以下if语句: if ([NSThread currentThread] != [NSThread mainThread]) 我暗自怀疑,这与 if (![[NSThread currentThread] isMainThread]) 我很怀疑,因为我们从字段中得到了一些崩溃报告(仅限iOS 6),这些报告似乎是由需要在非主线程上运行的代码引起的。代码似乎受到前一个if语句的保护,但考虑到我们看到的崩溃数量,我不相信 上述两个if语句是否等效,或者第一个是否可能由
if ([NSThread currentThread] != [NSThread mainThread])
我暗自怀疑,这与
if (![[NSThread currentThread] isMainThread])
我很怀疑,因为我们从字段中得到了一些崩溃报告(仅限iOS 6),这些报告似乎是由需要在非主线程上运行的代码引起的。代码似乎受到前一个if语句的保护,但考虑到我们看到的崩溃数量,我不相信
上述两个if语句是否等效,或者第一个是否可能由于某种原因而失败?这可能相同,也可能不同-使用
比较对象的结果=代码>通常没有文档记录。因为这是一个直接指针比较,所以它只会为完全相同的对象返回true,而不会在逻辑等价的情况下返回true。这就是为什么您应该始终使用专用的相等和比较方法来比较对象
(在这里,如果+[NSThread mainThread]
是一个单例,那么它们很有可能是相同的,但这是一个实现细节-即使它工作/似乎工作,也不应该依赖它。)
[NSThread currentThread]如何返回
同一条线
该文档不保证返回的NSThread
实例始终相同。假设的实施可以是:
+ (NSThread *)currentThread {
return [[NSThread alloc] initWithPrivateIdentifier:pthread_self()];
}
实际实现不太可能像这样工作。我的直觉甚至说,比较例如身份是安全的,但文档不支持这一点
给定线程是否可能有多个实例
文件中没有说明相反的情况。所以,是的,这至少是可以想象的
我试图确定这是否真的有机会修复一个我无法重现的崩溃
实际上,在实践中,我怀疑[NSThread currentThread]!=[NSThread mainThread]
与+[NSThread isMainThread]
不同,但这只是我的感觉。但理论上直接对象比较对我所做的应该是好的,对吧?有一个且只有一个主线程,因此如果当前线程是主线程,则内存地址应相同并通过测试。@Mike否。实际上直接比较对象可能是可以的。但从理论上讲,它是不正确的,因为没有文档记录总是为同一个线程返回同一个实例。如果有专用的isMainThread
,您应该使用它,因为不同的NSThread
实例可能代表相同的底层线程。可能不是这样,但如果他们给你这种方法,你应该使用它。@NikolaiRuhe你能进一步解释吗?[NSThread currentThread]
如何返回同一线程的不同实例?给定线程是否可能有多个实例?我对线的概念很生疏。我毫不怀疑我们应该使用isMainThread
,但我正在尝试确定这是否真的有机会修复无法重现的崩溃。最好的选择是使用class方法:+[NSThread isMainThread]
。这比你的代码简短明了。谢谢,这至少对我自己的理解有帮助。