【发布时间】:2011-09-01 18:58:09
【问题描述】:
我想知道什么时候应该使用NSString,什么时候应该使用NSMutableString,因为我们也可以在NSString中追加字符串,那么NSMutableString在Objective C编程中的有效用法是什么?
【问题讨论】:
标签: objective-c ios
我想知道什么时候应该使用NSString,什么时候应该使用NSMutableString,因为我们也可以在NSString中追加字符串,那么NSMutableString在Objective C编程中的有效用法是什么?
【问题讨论】:
标签: objective-c ios
我希望 MutableString 在内存方面会稍微更有效,因为您早先指出程序可能需要动态内存。 NSString 可能会被分配一个大小合适的内存块。
使用 NSString 及其stringBy... 方法,您可以创建新对象、释放旧对象(如果需要)并使新对象自动释放。 (如果您从非自动释放更改为自动释放,请注意,您的 dealloc 中可能有一个不再需要的释放)
【讨论】:
使用NSMutableString 时,您可以不分配和初始化以下操作:
我认为在这种情况下,除了free() + alloc() + init 之外,在使用NSString 的情况下,内存只会重新分配(realloc())
【讨论】:
当您需要一个字符串作为固定(不可变)字符串值和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~ 类都是一样的。
【讨论】:
使用 NSString 您只能创建新实例 - 这意味着为新对象实例分配内存并丢失旧实例 - 当您将字符串附加到引擎盖下的现有 NSString 时会发生这种情况。 NSString 你应该只用于不会改变其值的对象。
另一方面,使用 NSMutableString 时,您只使用一个对象实例——它只会改变它所拥有的字符串数据。内存效率更高,速度更快。
【讨论】: