"stringWithString"vs"alloc ... initWithString ... autorelease"

dre*_*ves 3 memory string cocoa objective-c

我已经看到它声称以下"非常相同":

foo([NSString stringWithString:@"blah"])                       # version 1
foo([[[NSString alloc] initWithString:@"blah"] autorelease])   # version 2
Run Code Online (Sandbox Code Playgroud)

事实上,上述字面上是等同还是有任何微妙的差异?选择其中一个的原因是什么?

Mar*_*ote 8

它们是等价的,但我更喜欢"stringWithString",因为它更简洁.


Mik*_*lah 7

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

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

foo(@"blah")
Run Code Online (Sandbox Code Playgroud)


rpe*_*ich 5

在大多数情况下,唯一的区别是额外的呼叫objc_msgSend.

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