【问题标题】:NSString copy not copying?NSString 复制不复制?
【发布时间】:2011-02-01 01:31:35
【问题描述】:
  NSString *myString = @"sample string";
  NSString *newString = [myString copy];

如果我在这两行之后设置断点,myString 的指针与 newString 的指针相同。

WTF? NSString 副本不应该返回指向新对象的指针吗?还是我错过了一些关于副本应该如何工作的基本知识?

【问题讨论】:

  • 我不知道答案,但是如果您更改 myString 则两者都有不同的地址...直到字符串的内容相同,它位于相同的地址...
  • 首先,您实际上并没有调用 copy,而是调用了 stringWithString:。其次,由于字符串是不可变的,因此编译器和运行时会进行优化。通常不可变对象将返回一个额外的引用计数,而不是创建一个实际的新对象。
  • 可可之美——不需要时不复制数据...
  • 糟糕,抱歉,这应该是一个副本(测试了几个不同的版本并粘贴了错误的版本)。不过,行为是相同的。
  • @JasonCoco 但它是对框架的“优化”,因为NSString 是一个“普通”类,而不是内置类型。

标签: iphone objective-c nsstring


【解决方案1】:

由于NSString 不可变,它可能只是在内部增加ref count 并完成它。

当您 release 其中一个 NSString 时,它可能只会减少 ref count - 标准内存管理。

你觉得这有什么问题吗?

【讨论】:

    【解决方案2】:

    想一想:NSMutableStringNSString 的子类。当您的属性声明为 NSString 时,您不会期望它会发生变化。

    考虑一下,如果你使用了retain,而有人给了你一个NSMutableString,然后又更改了它,你的课程就会被破坏。

    但是,您可能认为总是copying 很慢。所以NSStringcopy 只是调用retainNSMutableStringcopy 进行实际复制。

    通常最好吐出NSString *,因为人们不必一直复制它。

    【讨论】:

      【解决方案3】:

      您可以像示例中一样分配新变量

      NSString *anotherString = [[NSString alloc] initWithString:originalString];
      

      【讨论】:

        【解决方案4】:

        复制一个方法返回的字符串值是更好的做法,因为返回的值可能是一个可变的字符串对象,并且该值可以在该方法返回后在其他线程中修改。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-31
          • 1970-01-01
          • 2012-09-08
          • 1970-01-01
          • 2010-10-09
          • 1970-01-01
          • 2012-03-30
          • 1970-01-01
          相关资源
          最近更新 更多