【问题标题】:What is the maximum length of an NSString object?NSString 对象的最大长度是多少?
【发布时间】:2011-09-22 21:11:17
【问题描述】:

NSString 对象中可以保存的最大字符串大小是多少?

这是动态变化的吗?

【问题讨论】:

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

标签: iphone objective-c xcode nsstring max


【解决方案1】:

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

不过,正如其他人所指出的那样,实际限制要小得多 - 尤其是在 iOS 设备上,在达到 NSString 中的任何硬限制之前很久就会耗尽内存。

【讨论】:

  • 我给了 +1。但是,这是有缺陷的,因为它假定 1 个字符 = 1 个字节。
  • 它不能是NSUIntegerMax plus 1 -- 那么length 将无法在范围的一端或另一端返回正确的值.
  • @pst - 我尽量小心,只指字符,而不是字节。 @Josh - 你是对的。我将编辑我的答案。
  • @pst:NSStrings 名义上将其字符存储为unichars,即两个字节;但是,如果他们的所有字符都可以用纯 ASCII 表示,他们将尝试通过每个字符仅使用一个字节来节省内存——请参阅String Storage
  • 注意:在 Mac OS X 上它是 18,446,744,073,709,551,615 字节 (2^64 - 1)。请参阅 NSObjCRuntime,其中根据目标平台对 NSUInteger 有单独的定义。
【解决方案2】:

它可以容纳几乎与虚拟内存系统所能表示的一样多的内存。但我个人觉得最大长度只限于当时可用的任何内存。

【讨论】:

    【解决方案3】:

    NSString 实际上是一个类集群,因此不同的具体类(例如,NSStringNSMutableString)很有可能使我们使用不同的“后备存储”来存储数据。您甚至可以继承NSString 并提供您自己的后备存储实现,以满足您可能有的特定需求(查看"Subclassing Notes" for NSString)。

    至于NSString 实际使用的是哪个后备存储,这是一个Apple 没有记录的实现细节,它可能随时更改。

    就我自己而言,我假设NSString 的最大长度仅受可用内存的限制。实际上,由于可用内存可能非常大,因此会有一些其他限制(可能与性能相关),但我从未遇到过这样的限制。

    【讨论】:

    • 长度属性是一个 NSUInteger,因此无论类簇如何,它都是最大可能值。它还在初始化期间接受一个 NSData 对象,该对象也有一个 NSUInteger 作为它的长度属性。 NSUInteger 在 iOS 上是 32 位,在 OS X 上是 64 位。我已经在 OS X 上成功处理了大于 4GB 的字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 2010-11-20
    • 1970-01-01
    • 2015-11-24
    • 2016-07-13
    • 2014-07-22
    相关资源
    最近更新 更多