是alloc + initWithString:与copy相同吗?

tom*_*tom 1 cocoa nsstring

基本上,问题是 - 以下基本相同吗?

NSString *value1 = ...;
NSString *value2 = [[NSString alloc] initWithString:value1];
Run Code Online (Sandbox Code Playgroud)

NSString *value1 = ...;
NSString *value2 = [value1 copy];
Run Code Online (Sandbox Code Playgroud)

Pet*_*sey 5

从概念上讲,是的.但是,有一个区别:alloc始终创建一个新字符串,而copy可能返回相同的字符串.

特别是,不可变对象(如不可变字符串)可能copy通过返回自身而不是创建和返回副本来响应.(毕竟,如果你不能改变原文的任何内容,为什么你真的需要一个副本?)可变字符串将通过创建和返回副本来响应它,正如你所期望的那样.

initWithString:在中间:它可以释放接收器并返回你给它的字符串,类似于如何copy返回接收器.但是,如果发生这种情况,则意味着您浪费了创建的字符串alloc.有了copy,您可能根本不需要创建任何其他对象.

关于使用唯一的原因alloc,并initWithString:是,如果你有自己的NSString的子类,想让它的一个实例从现有的字符串.copy不会使用您想要的子类.由于在Cocoa中实际上从不保证NSString的子类化,因此使用initWithString:(或stringWithString:)也是如此.

所以底线是,只需使用copy(或mutableCopy).它更短,更清楚你的意图,并且可以更快.