"stringWithString"与"alloc ... initWithString ... autorelease"的区别

3

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

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

上述内容是否完全等同?还是有微妙的区别?选择其中一种的原因是什么?
4个回答

8
它们是等效的,但我更喜欢 "stringWithString" ,因为它更加简洁。

7
这两个方法在功能上是等效的,但正如rpetrich所指出的,它们在内部可能略有不同。这对你来说不应该有影响,使用其中任何一个都行。此外,虽然存在微小的性能差异,但实际上对你的应用程序几乎没有影响。
但是,所有这些都忽略了一个关键点:两者都是无意义的。通过编写@"foo",您已经拥有一个完全功能的NSString对象。没有必要使用额外的方法来复制字符串;直接执行操作会更快、更简单:
foo(@"blah")

谢谢Mike!关于foo(@"blah")的观点很好,尽管我实际上是从混乱的代码中提炼出来的,那时候可能不太可能。 - dreeves

5

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

反编译NSString会发现,它发送的不是+alloc,而是+allocWithZone:NSDefaultMallocZone()


嗯,听起来像是“不是字面上的等价,而只是在所有但最顶尖的obj-C黑客不必担心的方式下有所不同”?不过,这引出了一个后续问题:alloc和allocWithZone之间有什么区别? - dreeves
根据其他类似方法对的工作方式,我猜测+alloc正是这样做的-+allocWithZone:NSDefaultMallocZone()。 - Noah Witherspoon
现在真的不需要担心内存区域了。如果我没记错的话,以前可以通过将依赖链分组(和释放)为一个区域来利用内存区域来获得一些效率,但现在它大多数只是一个遗物。 - Chuck

4

+stringWithString:或+array等方法只是方便的方法,它们总是返回自动释放的对象。这些方法主要用于减少创建频繁的类(如字符串、数组、字典、数字等)所需编写的代码量。它们严格遵循基本的内存管理规则,其中我提到的那个规则也是从中得出的。


这就是它们不同的主要原因。 - Johannes Rudolph
自己创建了autorelease->没有区别 - Johannes Rudolph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接