2

古いコードを見ていると、次の if ステートメントが表示されます。

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

私はこれが

if (![[NSThread currentThread] isMainThread])

メイン スレッド以外で実行する必要があるコードが原因であると思われるクラッシュ レポート (iOS 6 のみ) がフィールドから得られているため、疑わしいと思います。コードは前者の if ステートメントによって保護されているように見えますが、私たちが目にしているクラッシュの数を考えると、私には確信が持てません。

上記の 2 つの 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()];
}

実際の実装がこのように機能する可能性は低いです。私の直感では、インスタンス ID を比較しても安全だとさえ言っていますが、ドキュメントはこれをサポートしていません。

特定のスレッドが複数のインスタンスを持つことは可能ですか?

ドキュメントには反対のことは記載されていません。ですから、はい、少なくとも考えられます。

再現できないクラッシュを修正できる可能性があるかどうかを判断しようとしています。

実際には、 と[NSThread currentThread] != [NSThread mainThread]は違うと+[NSThread isMainThread]思いますが、それは私の感覚です。

于 2013-01-03T16:01:44.740 に答える