为什么用 NSString *str1 = [[NSString alloc]init]; 分配两个字符串有相同的地址吗?

Why two strings allocated with NSString *str1 = [[NSString alloc]init]; have same address?

NSString *str1 = [[NSString alloc]init];
NSString *str2 = [[NSString alloc]init];
NSLog(@"%p\n%p",str1,str2);

result

str1:0x7fff7b559d00
str2:0x7fff7b559d00

为什么str1str2有相同的内存地址?

NSString 是不可变的,所以两个空字符串是相同的。因此,Cocoa 可以 return 每次创建相同的对象。

然而,真正的问题是,当 alloc return 两个字符串的两个不同地址时如何做到这一点?

答案是 init 可以用 self 的值替换它想要的任何东西,而 return 是一个完全不同的对象。比如NSStringinit可以这样实现:

-(id)init {
    static NSString *empty = nil;
    if (!empty) {
        empty = [[NSString alloc] initWithCharacters:"" length:0];
    }
    return empty;
}

注意:Cocoa中的真实代码几乎肯定会有所不同;这只是一个例子,展示了如何为不同的分配return编辑相同的地址。