+ [NSString stringWithString:] - 重点是什么?

时间:2009-10-23 23:00:54

标签: objective-c cocoa cocoa-touch nsstring

由于NSString字符串是不可变的,stringWithString:类方法的值是多少?

我在使用NSMutableString时获得该实用程序,我只是没有看到NSString类的实用程序。

7 个答案:

答案 0 :(得分:21)

您可能有一个要复制的NSMutableString(或某些自行开发的NSString子类)。

NSMutableString *buffer = [NSMutableString string];
// do something with buffer
NSString *immutableStringToKeepAround = [NSString stringWithString:buffer];

当然,你也可以复制一份:

NSMutableString *buffer = [NSMutableString string];
// do something with buffer
NSString *immutableStringToKeepAround = [[buffer copy] autorelease];

但您拥有该副本,必须发布或自动发布。

答案 1 :(得分:9)

正如“Andy”在#318666中指出的,它与内存管理有关,引用:

  

initWithString和stringWithString之间的区别在于stringWithString返回一个自动释放的指针。这意味着您不需要专门发布它,因为下次自动发布池会清除任何自动释放的指针时会注意这一点。

     另一方面,

initWithString返回一个保留计数为1的指针 - 你需要在该指针上调用release,否则会导致内存泄漏。

(取自here

答案 2 :(得分:1)

返回通过复制另一个给定字符串

中的字符而创建的字符串
[NSString stringWithString:@"some string"]

相当于

[[[NSString alloc] initWithString:@"some string"] autorelease]

答案 3 :(得分:1)

此外,如果你有一个指向NSString的指针,它实际上可能是NSString的子类,如NSMutableString。所以,如果你想存储字符串并保证它不会改变,你应该复制它,因此stringWithString存在。

答案 4 :(得分:1)

作为另一个用例,如果(无论出于何种原因)创建自己的NSString或NSMutableString子类,stringWithString:提供了一种方便的方法来使用NSString,NSMutableString或MyCustomString实例来实例化它。

答案 5 :(得分:0)

当我需要创建+stringWithString:时,我经常使用NSMutableString但是以初始值启动它。例如:

NSMutableString * output = [NSMutableString stringWithString:@"<ul>"];
for (NSString * item in anArray) {
  [output appendFormat:@"<li>%@</li>", item];
}
[output appendString:@"</ul>"];

答案 6 :(得分:0)

仅供参考,既然我们正在使用ARC进行编译,您根本不需要手动释放,ARC将在编译期间插入释放调用。那怎么还不一样呢? stringWithString仍然被添加到自动释放池中,将来某个时候会被耗尽(除非您创建了自己的自动释放池)。 initWithString将在函数结束之前进行释放调用,因此如果您没有将其保留在方法中的某个位置,则可以确保函数调用结束时该字符串被销毁。与使用自动释放的对象相比,这使您可以更严格地控​​制内存管理。