NSString对象的最大长度是多少?

33

NSString对象最大支持多长的字符串?

它是否可以动态更改?


我编辑了你的帖子。只是我不确定“动态”是什么意思,所以最后一个问题可能不反映当前的意图。 - user166390
1
它绝对可以容纳比任何iPhone或iPad上可用的RAM更多的内容。换句话说,您无法在当前的iOS设备上达到NSString的限制,但是您可能会耗尽内存。 - Costique
我同意Spencer Uresk的回答。 - Himanshu Agnihotri
3个回答

63

我认为NSString的硬限制应该是NSUIntegerMax个字符,因为NSString的索引和大小相关方法返回一个NSUInteger。由于当前能够运行iOS的所有设备都是32位的,这意味着NSUIntegerMax是2^32-1,NSString可以容纳略多于42亿个字符。

正如其他人指出的那样,在实践中,可用内存远远小于NSString的硬限制,特别是在iOS设备上,你很快就会耗尽内存,而不是达到NSString的硬限制。


3
我会尽力进行翻译:我给了 +1。然而,这种做法存在缺陷,因为它假设一个字符等于一个字节。 - user166390
它不能是 NSUIntegerMax 加上 1 -- 否则 length 将无法在范围的一端或另一端返回正确的值。 - jscs
@pst - 我尽量小心,只涉及字符而不是字节。@Josh - 你说得对。我会编辑我的回答。 - Spencer Uresk
3
NSString 命名上使用 unichar 来存储字符,它们占用两个字节;但是,如果所有字符都可以用普通 ASCII 表示,那么它们会尝试节省内存,每个字符只使用一个字节 -- 参见 String Storage - jscs
1
注意:在Mac OS X上,它是18,446,744,073,709,551,615字节(2^64-1)。请参见NSObjCRuntime,在目标平台上有一个单独的NSUInteger定义。 - Abhi Beckert

8
NSString实际上是一个类族(class-cluster),因此不同的具体类(比如NSStringNSMutableString)在存储数据时可能会使用不同的“后备存储区域”。您甚至可以子类化NSString,为您可能有的特定需求提供自己的后备存储实现(请参阅“NSString的子类说明”)。关于哪种后备存储实际上被NSString使用,这是Apple没有记录的实现细节,它可能随时更改。
就我个人而言,我认为NSString的最大长度仅受可用内存的限制。实际上,由于可用内存可能非常巨大,还会有其他限制(也许与性能相关),但我从未遇到过这种限制。

1
length属性是一个NSUInteger,因此无论类群如何,它都将是最大可能的值。在初始化期间,它还接受一个NSData对象,该对象也具有其长度属性的NSUInteger。在iOS上,NSUInteger为32位,在OS X上为64位。我已经成功地处理了在OS X上大于4GB的字符串。 - Abhi Beckert

3

它可以容纳几乎与虚拟存储系统表示的内存量一样多的内存。但我个人认为,最大长度仅限于当时可用的内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接