-4

可能重复:
为什么这两个 NSString 指针相同?

s1 & s2 的内存地址会一样吗?

如果是,那么为什么?

如果两个字符串都是可变的怎么办?

NSString *s1 = @"Hello";

NSString *s2 = [[NSString alloc]initWithString:@"Hello"];
4

1 回答 1

2

s1 & s2 的内存地址会一样吗?

也许——实现由基金会定义。

如果是,那么为什么?

当不需要复制时,实现可能会返回参数——当输入参数是不可变的时,您请求的对象的行为与输入参数相同NSString。当你传递不朽的NSString文字时,实现可以很容易地确定参数是不可变的,并选择返回参数(retained)。

当然,这是库(基金会)需要识别和支持的优化。

由于实现细节的差异,实现也可能选择返回输入参数。例如,如果字符串是使用外部拥有的字符缓冲区创建的,则实现可能会返回一个新字符串。它也可能承认参数是可变的,那么当然需要返回一个新的不可变对象表示。

如果两个字符串都是可变的怎么办?

那么深度复制更有可能——实现由 Foundation 定义。但是,您将拥有唯一的实例(它们的地址将不匹配)。

于 2012-08-11T19:22:34.573 回答