【问题标题】:"stringWithString" vs "alloc ... initWithString ... autorelease"“stringWithString”与“alloc ... initWithString ... autorelease”
【发布时间】:2010-09-30 17:54:10
【问题描述】:

我看到它声称以下内容“几乎等同”:

foo([NSString stringWithString:@"blah"])                       # version 1
foo([[[NSString alloc] initWithString:@"blah"] autorelease])   # version 2

以上内容实际上是等价的还是有任何细微的差别? 选择其中一个的原因是什么?

【问题讨论】:

    标签: objective-c cocoa string memory


    【解决方案1】:

    它们是等价的,但我更喜欢“stringWithString”,因为它更简洁。

    【讨论】:

      【解决方案2】:

      两者在功能上是等价的,但正如 rpetrich 所观察到的,它们的内部操作可能略有不同。这对您来说无关紧要,使用您认为更方便的那个。此外,虽然存在细微的性能差异,但在实践中对您的应用程序影响不大。

      但这一切都忽略了一个关键点:两者都毫无意义。通过编写 @"foo" 你已经拥有了一个功能齐全的 NSString 对象。无需使用额外的方法来复制字符串;这样做更快更简单:

      foo(@"blah")
      

      【讨论】:

      • 谢谢迈克!关于 foo(@"blah") 的优点虽然我实际上是从更混乱的代码中提炼出来的,但这是不可能的。
      【解决方案3】:

      在大多数情况下,唯一的区别是额外调用objc_msgSend

      反编译 NSString 显示,它不是发送+alloc,而是发送+allocWithZone:NSDefaultMallocZone()

      【讨论】:

      • 嗯,听起来像“不是字面上等同的,只是在某些方面有所不同,除了最顽固的 obj-C 黑客外,其他人都不应该担心他们漂亮的小脑袋”?尽管如此,它还是引出了一个后续问题:alloc 和 allocWithZone 有什么区别?
      • 按照其他类似方法对的工作方式,我猜 +alloc 正是这样做的 - +allocWithZone:NSDefaultMallocZone()。
      • 现在真的没有必要担心内存区域了。 IIRC,过去可以通过将依赖链分组(和释放)作为一个区域来使用内存区域来获得一些效率,但现在它主要是一个遗迹。
      【解决方案4】:

      诸如 +stringWithString: 或 +array 之类的方法只是方便的方法,它们总是返回自动释放的对象。这些主要是为了减少为经常创建的类(例如字符串、数组、字典、数字等)编写的代码量。它们严格遵循我上面提到的基本内存管理规则。

      【讨论】:

      • 这就是它们不同的第一原因
      • 因为你自己做了自动释放 -> 没有区别
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多