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

时间:2015-10-25 01:58:39

标签: ios objective-c nsstring

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

result

str1:0x7fff7b559d00
str2:0x7fff7b559d00

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

1 个答案:

答案 0 :(得分:1)

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

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

答案是init允许用self代替它所希望的任何东西,并返回一个完全不同的对象。例如,NSString' init可以像这样实现:

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

注意: Cocoa中的真实代码几乎肯定会有所不同;这只是一个说明,说明如何为不同的分配返回相同的地址。