Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 什么';isMainThread和currentThread==mainThread之间的区别是什么?_Ios_Nsthread - Fatal编程技术网

Ios 什么';isMainThread和currentThread==mainThread之间的区别是什么?

Ios 什么';isMainThread和currentThread==mainThread之间的区别是什么?,ios,nsthread,Ios,Nsthread,我正在查看一些旧代码,并看到以下if语句: if ([NSThread currentThread] != [NSThread mainThread]) 我暗自怀疑,这与 if (![[NSThread currentThread] isMainThread]) 我很怀疑,因为我们从字段中得到了一些崩溃报告(仅限iOS 6),这些报告似乎是由需要在非主线程上运行的代码引起的。代码似乎受到前一个if语句的保护,但考虑到我们看到的崩溃数量,我不相信 上述两个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]
。这比你的代码简短明了。谢谢,这至少对我自己的理解有帮助。