2011-06-26 8 views
31

Jaki jest łańcuch o maksymalnej wielkości, który może być przechowywany w obiekcie NSString?Jaka jest maksymalna długość obiektu NSString?

Czy zmienia się to dynamicznie?

+2

Może pomieścić dużo. Czemu? –

+0

Edytowałem post. Po prostu nie byłem pewien, co rozumiem przez "dynamicznie?", Więc ostatnie pytanie może nie odzwierciedlać intencji. –

+1

Z pewnością może pomieścić o wiele więcej niż pamięć RAM dostępna na iPhonie lub iPadzie. Innymi słowy, nie możesz przekroczyć limitów NSString na obecnych urządzeniach z iOS, ale możesz zabraknąć pamięci. – Costique

Odpowiedz

60

Zakładam, że twardym ograniczeniem dla NSString będą znaki NSUIntegerMax, ponieważ metody indeksowania i wielkości NSString zwracają NSUInteger. Ponieważ wszystkie urządzenia, na których obecnie działa iOS, są 32-bitowe, oznacza to, że NSUIntegerMax to 2^32 - 1, a NSString może pomieścić nieco ponad 4,2 miliarda znaków.

Jednak, jak podkreślają inni, praktyczny limit jest znacznie mniejszy - na urządzeniu z systemem iOS szczególnie zabraknie pamięci na długo przed osiągnięciem twardego limitu w NSString.

+3

Dałem +1. Jest to jednak wadliwe, ponieważ zakłada 1 znak = 1 bajt. –

+0

Nie może to być 'NSUIntegerMax' _plus_' 1' - wtedy 'length' nie będzie w stanie zwrócić poprawnej wartości na jednym końcu lub innym zakresie. –

+0

@pst - Starałem się być ostrożnym i odnosić się tylko do znaków, a nie bajtów. @Josh - Masz rację. Będę edytować moją odpowiedź. –

8

to tak naprawdę klaster klasy, więc jest wysoce prawdopodobne, że różne klasy betonu (np. NSString vs. NSMutableString) sprawią, że będziemy mieli różne "rezerwowe magazyny" do przechowywania danych. Można nawet podklasę NSString i zapewnić własną implementację sklepu kopii zapasowych dla konkretnych potrzeb (patrz: "Subclassing Notes" for NSString).

To, do którego sklepu kopii zapasowych jest faktycznie używany przez NSString, jest to szczegół implementacji, który nie jest udokumentowany przez firmę Apple i może się zmienić w dowolnym momencie.

Dla siebie, zakładam, że maksymalna długość NSString jest ograniczona tylko dostępną pamięcią. W rzeczywistości, ponieważ dostępna pamięć może być naprawdę ogromna, będzie jakiś inny limit (może związany z wydajnością), ale nigdy nie ponosiłem takich ograniczeń.

+1

Właściwość length to NSUInteger, więc niezależnie od klastrów klas będzie to maksymalna możliwa wartość. Przyjmuje również obiekt NSData podczas inicjalizacji, który ma również wartość NSUInteger dla swojej właściwości length. NSUInteger jest 32-bitowy na iOS i 64-bitowy na OS X. Udało mi się pracować z ciągami większymi niż 4GB na OS X. –

3

Może pomieścić prawie tyle pamięci, ile może być reprezentowane przez system pamięci wirtualnej. Ale osobiście uważam, że maksymalna długość jest ograniczona tylko do pamięci dostępnej w tym czasie.

Powiązane problemy