【发布时间】:2009-10-23 23:00:54
【问题描述】:
由于NSString字符串是不可变的,那么stringWithString:类方法的值是多少?
当与NSMutableString 一起使用时,我得到了实用程序,我只是没有看到与NSString 类一起使用的实用程序。
【问题讨论】:
标签: objective-c cocoa cocoa-touch nsstring
由于NSString字符串是不可变的,那么stringWithString:类方法的值是多少?
当与NSMutableString 一起使用时,我得到了实用程序,我只是没有看到与NSString 类一起使用的实用程序。
【问题讨论】:
标签: objective-c cocoa cocoa-touch nsstring
您可能想要复制一个 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];
但您拥有该副本并且必须释放或自动释放它。
【讨论】:
正如“Andy”在 #318666 中指出的那样,它与内存管理有关,引用:
initWithString 和 stringWithString 的区别在于 stringWithString 返回一个自动释放的指针。这意味着您不需要专门释放它,因为下次自动释放池清理任何自动释放的指针时会处理它。
另一方面,initWithString 返回一个保留计数为 1 的指针 - 您确实需要对该指针调用 release,否则会导致内存泄漏。
(取自here)
【讨论】:
返回通过复制另一个给定字符串中的字符创建的字符串
[NSString stringWithString:@"some string"]
相当于
[[[NSString alloc] initWithString:@"some string"] autorelease]
另外,如果你有一个指向 NSString 的指针,它实际上可能是 NSString 的子类,比如 NSMutableString。所以,如果你想存储字符串并保证它不会改变,你应该复制它,因此 stringWithString 存在。
【讨论】:
NSString *string = @"str"; NSMutableString *mStr = [NSMutableString stringWithString:string]; 的东西并得到一个可变字符串。
copy 属性的属性。
作为另一个用例,如果(无论出于何种原因)您创建自己的 NSString 或 NSMutableString 子类,stringWithString: 提供了一种方便的方法来使用 NSString、NSMutableString 或 MyCustomString 的实例对其进行实例化。
【讨论】:
当我需要创建NSMutableString 但以初始值开始时,我经常使用+stringWithString:。例如:
NSMutableString * output = [NSMutableString stringWithString:@"<ul>"];
for (NSString * item in anArray) {
[output appendFormat:@"<li>%@</li>", item];
}
[output appendString:@"</ul>"];
【讨论】:
仅供参考,现在我们在启用 ARC 的情况下进行编译,您根本不必手动发布,ARC 将在编译期间插入发布调用。那么它还有什么不同呢? stringWithString 仍被添加到自动释放池中,该池在未来某个时候会被耗尽(除非您创建了自己的自动释放池)。 initWithString 在函数结束之前会有一个释放调用,所以如果你没有在方法的某个地方保留它,你可以确定字符串在函数调用结束时被销毁。与使用自动释放的对象相比,这使您可以更严格地控制内存管理。
【讨论】: