初始化字符串的几个方法:
//__NSCFConstantString ,内存在数据区
NSString * str = @"hello world";
// __NSCFString类型,内存在堆区,autorelease 型
NSString * str = [NSString stringWithFormat:@"nicknicknick"];
// NSTaggedPointerString类型,内存在栈区
NSString * str = [NSString stringWithFormat:@"nick"];
// __NSCFString类型,内存在堆区
NSString * str = [[NSString alloc]initWithFormat:@"nicknicknick"];
// NSTaggedPointerString类型,内存在栈区
NSString * str = [[NSString alloc]initWithFormat:@"nick"];
说明
验证
关于字符串判等和地址的问题
首先要知道,==
是对地址的比较
// 情况一
NSString * firstName = [[NSString alloc]initWithFormat:@"nicknicknicknick"];
NSString * secondName = [[NSString alloc]initWithFormat:@"nicknicknicknick"];
if (firstName == secondName) {
NSLog(@"相等:%p == %p",firstName,secondName);
}else{
NSLog(@"不相等:%p == %p",firstName,secondName);
}
//地址不相等
打印:不相等:0x6000021ee670 == 0x6000021ee550
// 情况二 ----------------------------------------------------------------
NSString * firstName = [[NSString alloc]initWithFormat:@"nick"];
NSString * secondName = [[NSString alloc]initWithFormat:@"nick"];
// 地址相等
打印:相等:0xde6fb5b6280d4ec0 == 0xde6fb5b6280d4ec0
// 情况三 ----------------------------------------------------------------
NSString * firstName = @"nick";
NSString * secondName = @"nick";
// 地址相等
打印:相等:0x10918fa88 == 0x10918fa88
总结
系统对字符串是有优化的,如果是在 数据区或者栈区 的 字符串,对于值相同的字符串,会使用同一份内存地址,也就是一个字符串对象,在判等的时候,就会相等,如果是在堆区,也就是我们自己管理内存,才会使用新的内存地址去存储新的对象,所以即便 字符串的 value 相同,但是也不是同一个对象。