“stringWithString”vs“alloc ... initWithString ... autorelease”

时间:2009-01-11 03:49:19

标签: objective-c cocoa string memory

我看到它声称以下内容“非常相同”:

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

上述情况实际上是等同的还是有任何微妙的差异? 选择其中一个的原因是什么?

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:7)

这两者在功能上是等价的,但正如rpetrich观察到的那样,内部可能会有所不同。这对您来说无关紧要,请使用对您来说更方便的方式。此外,虽然性能差异很小,但在实践中对您的应用程序来说极不重要。

但这一切都错过了一个关键点:两者都没有意义。通过编写@“foo”,您已经拥有了一个功能齐全的NSString对象。没有必要乱用额外的方法来复制字符串;这样做更快捷,更简单:

foo(@"blah")

答案 2 :(得分:5)

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

反编译NSString表明它不是发送+alloc而是发送+allocWithZone:NSDefaultMallocZone()

答案 3 :(得分:4)

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