【问题标题】:+[NSString stringWithString:] -- what's the point?+[NSString stringWithString:] -- 有什么意义?
【发布时间】:2009-10-23 23:00:54
【问题描述】:

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

当与NSMutableString 一起使用时,我得到了实用程序,我只是没有看到与NSString 类一起使用的实用程序。

【问题讨论】:

    标签: objective-c cocoa cocoa-touch nsstring


    【解决方案1】:

    您可能想要复制一个 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];
    

    但您拥有该副本并且必须释放或自动释放它。

    【讨论】:

    • 一个小的区别是 [[nil copy] autorelease] 会返回 nil,但 [NSString stringWithString:nil] 会抛出异常。
    【解决方案2】:

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

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

    另一方面,initWithString 返回一个保留计数为 1 的指针 - 您确实需要对该指针调用 release,否则会导致内存泄漏。

    (取自here

    【讨论】:

      【解决方案3】:

      返回通过复制另一个给定字符串中的字符创建的字符串

      [NSString stringWithString:@"some string"]
      

      相当于

      [[[NSString alloc] initWithString:@"some string"] autorelease]
      
      【解决方案4】:

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

      【讨论】:

      • 不确定这是否完全有效 - 因为,正如您所指出的,NSMutableString 是 NSString 的子类,您实际上可以拥有类似 NSString *string = @"str"; NSMutableString *mStr = [NSMutableString stringWithString:string]; 的东西并得到一个可变字符串。
      • 我的意思是如果你有像 -(void) setName:(NSString *)name; 这样的方法您实际上并不知道 name 是 NSString 还是子类。所以,你可能想要复制它,这样它的价值就不会在你背后改变。
      • @FigBug:但这可能是预期的功能。我相信实现您想要的正确方法是使用具有copy 属性的属性。
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

          仅供参考,现在我们在启用 ARC 的情况下进行编译,您根本不必手动发布,ARC 将在编译期间插入发布调用。那么它还有什么不同呢? stringWithString 仍被添加到自动释放池中,该池在未来某个时候会被耗尽(除非您创建了自己的自动释放池)。 initWithString 在函数结束之前会有一个释放调用,所以如果你没有在方法的某个地方保留它,你可以确定字符串在函数调用结束时被销毁。与使用自动释放的对象相比,这使您可以更严格地控​​制内存管理。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-24
            • 2012-09-08
            相关资源
            最近更新 更多