2011-06-26 14 views
31

¿Cuál es la cadena de tamaño máximo que se puede retener en un objeto NSString?¿Cuál es la longitud máxima de un objeto NSString?

¿Esto cambia dinámicamente?

+2

Puede contener mucho. ¿Por qué? –

+0

Lo edité. Simplemente no estaba seguro de lo que significaba "dinámicamente", por lo que la última pregunta puede no reflejar el intento actualmente. –

+1

Definitivamente puede contener mucho más que RAM disponible en cualquier iPhone o iPad. En otras palabras, no puede alcanzar los límites de NSString en dispositivos iOS actuales, pero puede quedarse sin memoria. – Costique

Respuesta

60

Supongo que el límite estricto para NSString serían los caracteres NSUIntegerMax, ya que los métodos relacionados con el índice y el tamaño de NSString devuelven un NSUInteger. Como todos los dispositivos actualmente capaces de ejecutar iOS son de 32 bits, esto significa que NSUIntegerMax es 2^32 - 1 y NSString puede contener algo más de 4,2 mil millones de caracteres.

Como han señalado otros, el límite práctico es mucho menor: especialmente en un dispositivo iOS, se le agotará la memoria mucho antes de que llegue a un límite estricto en NSString.

+3

Di +1. Sin embargo, esto tiene fallas porque asume 1 carácter = 1 byte. –

+0

No puede ser 'NSUIntegerMax' _plus_' 1' - luego 'length' no podría devolver el valor correcto en un extremo u otro del rango. –

+0

@pst - Traté de tener cuidado y solo referirme a los caracteres, no a los bytes. @Josh - Estás en lo cierto. Editaré mi respuesta. –

8

NSString es en realidad una clase-clúster, por lo que es muy posible que diferentes clases concretas (por ejemplo, NSString vs NSMutableString) nos van a hacer de diferentes "almacenes de respaldo" para almacenar los datos. Incluso podría incluir la subclase NSString y proporcionar su propia implementación de la tienda de respaldo, para las necesidades específicas que pueda tener (consulte "Subclassing Notes" for NSString).

En cuanto a qué almacén de respaldo es realmente utilizado por NSString, este es un detalle de implementación que no está documentado por Apple, y podría cambiar en cualquier momento.

Para mí, supongo que la longitud máxima de NSString solo está limitada por la memoria disponible. En realidad, dado que la memoria disponible puede ser muy grande, habrá algún otro límite (tal vez relacionado con el rendimiento), pero nunca he incurrido en tal límite.

+1

La propiedad de longitud es un NSUInteger, por lo que independientemente de los clústeres de clase que será el máximo valor posible. También acepta un objeto NSData durante la inicialización, que también tiene un NSUInteger para su propiedad de longitud. NSUInteger es de 32 bits en iOS y de 64 bits en OS X. He trabajado con éxito con cadenas de más de 4 GB en OS X. –

3

Puede almacenar casi tanta memoria como pueda representarse con el sistema de memoria virtual. Pero personalmente siento que la duración máxima solo se limita a la memoria disponible en ese momento.

Cuestiones relacionadas