0
点赞
收藏
分享

微信扫一扫

iOS 刷新对 NSString 字符串 的认知

初始化字符串的几个方法:

//__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 相同,但是也不是同一个对象。

举报

相关推荐

0 条评论