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;
}