2

大きな NSMutableString (潜在的に数百メガバイト) があり、多くの rangeOfCharacterFromSet: 操作を実行する必要があります。

パフォーマンスを向上させるために、NSOperationQueue で文字列を ~100kb のチャンクに分割し、それぞれを非同期的に処理したいと考えています。

しかし、文字列が非常に大きいため、スレッドごとに不変のコピーを作成することは現実的ではありません。

文字列の変更を許可しないと仮定すると (操作キューが終了するまでメイン スレッドをブロックするつもりです)、これは安全ですか?

Apple は NSString をスレッドセーフであり、すべての不変オブジェクトを「一般的に」スレッドセーフではないとして文書化していますが、おそらく一部のメソッドにのみ適用されますか? rangeOfCharacterFromSet は、私が使用している唯一のものです。

このコードは、OS X と iOS の両方で実行されます (通常、iOS ではより小さな文字列を使用します)。

4

1 に答える 1

3

NSMutableString (または少なくともその一般的な実装) はこれに対して安全であると思いますが、最も安全な答えは、おそらく単一の不変コピーを作成し、それに対してすべての操作を行うことです。

非常に大きな NSMutableStrings が内部的にツリーとして実装される可能性があり、そのツリーが読み取り時に遅延リバランスを行う場合、スレッド セーフの問題が発生する可能性があるため、注意が必要です。

于 2013-05-04T00:38:17.360 に答える