可能重复:
为什么这两个 NSString 指针相同?
s1 & s2 的内存地址会一样吗?
如果是,那么为什么?
如果两个字符串都是可变的怎么办?
NSString *s1 = @"Hello";
NSString *s2 = [[NSString alloc]initWithString:@"Hello"];
可能重复:
为什么这两个 NSString 指针相同?
s1 & s2 的内存地址会一样吗?
如果是,那么为什么?
如果两个字符串都是可变的怎么办?
NSString *s1 = @"Hello";
NSString *s2 = [[NSString alloc]initWithString:@"Hello"];
s1 & s2 的内存地址会一样吗?
也许——实现由基金会定义。
如果是,那么为什么?
当不需要复制时,实现可能会返回参数——当输入参数是不可变的时,您请求的对象的行为与输入参数相同NSString
。当你传递不朽的NSString
文字时,实现可以很容易地确定参数是不可变的,并选择返回参数(retained
)。
当然,这是库(基金会)需要识别和支持的优化。
由于实现细节的差异,实现也可能选择不返回输入参数。例如,如果字符串是使用外部拥有的字符缓冲区创建的,则实现可能会返回一个新字符串。它也可能承认参数是可变的,那么当然需要返回一个新的不可变对象表示。
如果两个字符串都是可变的怎么办?
那么深度复制更有可能——实现由 Foundation 定义。但是,您将拥有唯一的实例(它们的地址将不匹配)。