2011-09-16 6 views
1

大丈夫ですか?はViewControllerのプロパティのスレッドセーフにアクセスしていますか?

[BNUtilitiesQuick searchController].searchList.textメインスレッドにはありませんか?例えば?

私はNSString *がthreadSafeであると聞いたことがあります。しかし、

私は別の文字列に

NSString * searchTerm =[BNUtilitiesQuick searchController].searchList.text; 

[BNUtilitiesQuick searchController].searchList.text変更を実行するときは?

答えて

1

ここでマルチスレッド環境で主に関心を持つのは、参照しようとしているオブジェクトが解放されないということです。

Objective-Cドキュメントdeclaring propertiesに記載されているように、合成プロパティを持つカスタムクラスを使用していると仮定すると、プロパティはデフォルトでアトミックに宣言されます。合成されたコードは、次のようになります。

[_internal lock]; // lock using an object-level lock 
id result = [[value retain] autorelease]; 
[_internal unlock]; 
return result; 

これを、多かれ少なかれ、あなたはあなたにリリースされていることを心配せずに返されたオブジェクトを使用してみましょう。したがって、プロパティをnonatomicと宣言していない場合は、不適切なメモリ管理によるクラッシュからの保護に関しては問題ありません。

カスタムクラスでない場合は、クラスのドキュメントを参照して、プロパティの宣言方法を確認してください。

ただし、データの整合性は別の問題です。あなたのコード行で指定されたすべてのプロパティがアトミックに宣言されていても、すべてのスレッドが常に同じ値を参照するとは限りません。だから、textの値は、あなたが記述した方法でスレッドがその値を取得する間に変更される可能性があります。最も簡単な解決策は、同じスレッドからの変更可能なデータの読み書きです。

そして、はい、NSStringは、不変であるため、一般にスレッドセーフです。

詳細については、Appleのthread programming guideをご覧ください。

+0

デフォルトはアトミックかもしれませんが、ほとんどのUIKitクラスは非アトミックなプロパティを宣言しています。私はカスタムやUIKitからのクラスであるかどうか分かりません。 – morningstar

+0

@morningstar、あなたのコメントを反映するように更新されました。ありがとう。 – nloko

関連する問題