Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么两个字符串被分配了NSString*str1=[[NSString alloc]init];你有相同的地址吗?_Ios_Objective C_Nsstring - Fatal编程技术网

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

Ios 为什么两个字符串被分配了NSString*str1=[[NSString alloc]init];你有相同的地址吗?,ios,objective-c,nsstring,Ios,Objective C,Nsstring,为什么str1和str2具有相同的内存地址?NSString是不可变的,所以两个空字符串是相同的。因此,Cocoa可以在每次创建时返回相同的对象 然而,真正的问题是,当alloc为两个字符串返回两个不同的地址时,如何做到这一点 答案是允许init用self的值替换它想要的任何值,并返回一个完全不同的对象。例如,NSString的init可以这样实现: NSString *str1 = [[NSString alloc]init]; NSString *str2 = [[NSString allo

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

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

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

答案是允许
init
self
的值替换它想要的任何值,并返回一个完全不同的对象。例如,
NSString
init
可以这样实现:

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

result

str1:0x7fff7b559d00
str2:0x7fff7b559d00

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

看起来Objective-C使用了字符串池(就像Java一样)。
-(id)init {
    static NSString *empty = nil;
    if (!empty) {
        empty = [[NSString alloc] initWithCharacters:"" length:0];
    }
    return empty;
}