NSString *str1 = [[NSString alloc]init];
NSString *str2 = [[NSString alloc]init];
NSLog(@"%p\n%p",str1,str2);
result
str1:0x7fff7b559d00
str2:0x7fff7b559d00
为什么str1
和str2
具有相同的内存地址?
答案 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中的真实代码几乎肯定会有所不同;这只是一个说明,说明如何为不同的分配返回相同的地址。