为什么用 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
为什么str1
和str2
有相同的内存地址?
NSString
是不可变的,所以两个空字符串是相同的。因此,Cocoa 可以 return 每次创建相同的对象。
然而,真正的问题是,当 alloc
return 两个字符串的两个不同地址时如何做到这一点?
答案是 init
可以用 self
的值替换它想要的任何东西,而 return 是一个完全不同的对象。比如NSString
的init
可以这样实现:
-(id)init {
static NSString *empty = nil;
if (!empty) {
empty = [[NSString alloc] initWithCharacters:"" length:0];
}
return empty;
}
注意:Cocoa中的真实代码几乎肯定会有所不同;这只是一个例子,展示了如何为不同的分配return编辑相同的地址。
NSString *str1 = [[NSString alloc]init];
NSString *str2 = [[NSString alloc]init];
NSLog(@"%p\n%p",str1,str2);
result
str1:0x7fff7b559d00
str2:0x7fff7b559d00
为什么str1
和str2
有相同的内存地址?
NSString
是不可变的,所以两个空字符串是相同的。因此,Cocoa 可以 return 每次创建相同的对象。
然而,真正的问题是,当 alloc
return 两个字符串的两个不同地址时如何做到这一点?
答案是 init
可以用 self
的值替换它想要的任何东西,而 return 是一个完全不同的对象。比如NSString
的init
可以这样实现:
-(id)init {
static NSString *empty = nil;
if (!empty) {
empty = [[NSString alloc] initWithCharacters:"" length:0];
}
return empty;
}
注意:Cocoa中的真实代码几乎肯定会有所不同;这只是一个例子,展示了如何为不同的分配return编辑相同的地址。