【问题标题】:When should we use NSString and NSMutableString?我们什么时候应该使用 NSString 和 NSMutableString?
【发布时间】:2011-09-01 18:58:09
【问题描述】:

我想知道什么时候应该使用NSString,什么时候应该使用NSMutableString,因为我们也可以在NSString中追加字符串,那么NSMutableString在Objective C编程中的有效用法是什么?

【问题讨论】:

    标签: objective-c ios


    【解决方案1】:

    我希望 MutableString 在内存方面会稍微更有效,因为您早先指出程序可能需要动态内存。 NSString 可能会被分配一个大小合适的内存块。

    使用 NSString 及其stringBy... 方法,您可以创建新对象、释放旧对象(如果需要)并使新对象自动释放。 (如果您从非自动释放更改为自动释放,请注意,您的 dealloc 中可能有一个不再需要的释放)

    【讨论】:

      【解决方案2】:

      使用NSMutableString 时,您可以不分配和初始化以下操作:

      1. 附加一些字符串或格式
      2. 删除或替换字符串中的字符
      3. 插入或替换字符串

      我认为在这种情况下,除了free() + alloc() + init 之外,在使用NSString 的情况下,内存只会重新分配(realloc()

      【讨论】:

        【解决方案3】:

        当您需要一个字符串作为固定(不可变)字符串值NSMutableString 作为可编辑(可变)字符串容器(缓冲区)时,您应该使用NSString强>。

        如果您不确定,请主要使用NSString。在大多数情况下,它会提供更好的整体性能。

        为什么我更喜欢NSString

        NSString 的值永远不会改变。这意味着您可以确定一旦创建 NSString 将永远保持原样,无论您在上面做什么。因此,您可以信任经过验证的字符串值,而无需任何额外检查。这大大降低了程序的复杂性和检查成本。

        NSMutableString 没有这种保证。将NSMutableString 传递给某个函数或方法后,现在您无法知道它的当前值。现在您需要执行验证或再次检查。

        你可以认为你知道什么会改变或不改变。但是对于大型程序或其他人的代码,则很难确定。只需使用NSString 就可以大大简化这一过程,因此您需要担心的事情会更少。

        NSString 每次更改字符串时都需要分配新对象,但它如何更高效?

        对于整个程序,实际上您并不总是更改字符串。实际上,许多字符串值不需要更改。您可以按原样分配或复制字符串。当您复制 NSMutableString 时,它会进行精确复制,这需要 CPU 资源、内存访问、内存空间。 NSString 不需要实际的复制操作,因为它没有被复制。这是可能的,因为它保证不会被更改(不可变),所以它只是重复使用自己。几乎没有任何成本。

        而且你应该有相当少的代码需要大量的字符串编辑。在那里使用NSMutableString。因为NSString 无法更改,所以当您需要一些新的字符串值时,它需要创建一个新对象。这是低效的,几乎是NSString唯一低效的地方。

        NSMutableString 的唯一优点是它支持就地编辑。换句话说,当你想要创建新的字符串值时,它不需要创建新的对象。因此,如果您需要进行许多更改,可以节省对象制作成本。

        Cocoa 旨在利用这种可变性分离。你会发现你需要声明 @property (copy) 而不是 @property (strong) 以确保对象不会受到程序其他地方的任何更改的影响。 NSString 在这里效率很高,不像NSMutableString 每次都需要复制。

        这对于所有 NS~/NSMutable~ 类都是一样的。

        【讨论】:

          【解决方案4】:

          使用 NSString 您只能创建新实例 - 这意味着为新对象实例分配内存并丢失旧实例 - 当您将字符串附加到引擎盖下的现有 NSString 时会发生这种情况。 NSString 你应该只用于不会改变其值的对象。

          另一方面,使用 NSMutableString 时,您只使用一个对象实例——它只会改变它所拥有的字符串数据。内存效率更高,速度更快。

          【讨论】:

            猜你喜欢
            • 2021-09-07
            • 2012-11-24
            • 2015-04-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-04
            • 2017-09-13
            • 2021-12-29
            相关资源
            最近更新 更多