2011-06-26 14 views
31

NSStringオブジェクトに保持できる最大サイズの文字列は何ですか?NSStringオブジェクトの最大長はどれくらいですか?

これは動的に変化しますか?

+2

多くを保持することができます。どうして? –

+0

投稿を編集しました。私はちょうど "動的に"意味されていたか分からなかったので、最後の質問は現在の意図を反映していないかもしれません。 –

+1

これは、iPhoneやiPadで利用可能なRAMよりもはるかに多くを保持できます。言い換えれば、現在のiOSデバイスではNSStringの制限を超えることはできませんが、メモリが足りなくなる可能性があります。 – Costique

答えて

60

NSStringのインデックスとサイズに関連するメソッドはNSUIntegerを返すので、NSStringのハード制限はNSUIntegerMax文字であると仮定します。現在iOSを実行できるすべてのデバイスは32ビットなので、NSUIntegerMaxは2^32-1でNSStringは42億文字を少し超えることができます。

他の人が指摘しているように、実用的な制限ははるかに小さくなっています。特に、iOSデバイスでは、NSStringのハード制限を超える前にメモリが不足しています。

+3

+1を付けました。しかし、これは1文字= 1バイトと仮定しているという点で欠陥がある。 –

+0

'NSUIntegerMax' _plus_' 1'にすることはできません。 'length'は、範囲の一端または他のところで正しい値を返すことができません。 –

+0

@pst - 私は慎重にしようとし、バイトではなく文字のみを参照しようとしました。 @Josh - あなたは正しいです。私は私の答えを編集します。 –

8

NSStringは実際クラスクラスターなので、さまざまな具体的なクラス(たとえば、NSStringNSMutableString)は、データを格納するためのさまざまな「バッキングストア」を作成する可能性が高くなります。 NSStringをサブクラス化し、特定のニーズに応じて独自のバッキングストア実装を提供することもできます("Subclassing Notes" for NSString参照)。

NSStringによって実際にバッキングストアが使用されているかどうかは、Appleによって記載されていない実装の詳細であり、いつでも変更することができます。

自分では、NSStringの最大長は使用可能なメモリによってのみ制限されると仮定します。実際には、使用可能なメモリは実際には巨大なものになる可能性があるため、その他の制限(パフォーマンスに関連するものかもしれません)がありますが、このような制限はありません。

+1

lengthプロパティはNSUIntegerなので、可能な限り最大のクラスクラスターに関係なくです。また、初期化中にNSDataオブジェクトを受け取ります。このオブジェクトには、lengthプロパティのNSUIntegerもあります。 NSUIntegerはiOSでは32ビット、OS Xでは64ビットです。OS Xでは4GBを超えるストリングで正常に動作しました。 –

3

仮想メモリシステムで表現できるほどのメモリを保持できます。しかし、私は個人的には、最大長はその時に利用可能なメモリに制限されていると感じています。

関連する問題