在学习自动释放池与RunLoop的关系的时候发现申明NSString类型的变量未随RunLoop的进入休眠而释放,通过查看资料以及代码验证解除了心中疑惑
NSString *str =@"str";
NSString *str1 =@"str111111111";
NSString * str2 = [NSString stringWithString:@"sa"];
NSString * str3 = [NSString stringWithString:@"sa777777777777"];
NSString *str4= [[NSString alloc] initWithString:@"123"];
NSString *str5 = [[NSString alloc] initWithString:@"123dertyuiuyt"];
str ...5 打印的类型都为NSCFConstantString 都存放在常量区 由程序控制释放,在程序结束的时候释放
NSString *str6 = [NSString stringWithFormat:@"sunnyxx"];
NSString *str7 = [NSString stringWithFormat:@"sunnyxx3333333"];
NSString *str8 = [[NSString alloc] initWithFormat:@"wxwe"];
NSString *str9 = [[NSString alloc] initWithFormat:@"wxwe444444444"];
str6....9 大于9位时类型__NSCFString 小于9时为NSTaggedPointerString __NSCFString类型ARC下通过release和自动释放池来释放 aggedPointerString 它的作用就是:节省短的变量的内存。用指针地址的富余位存变量值。 NSTaggedPointerString:phone 5s的时候,为了节省内存和提高执行效率,苹果提出了Tagged Pointer的概念 这个地址本身其实就存储了字符串的值 可以说是存储在&strS内存中值,只是伪装成了地址,它不需要存储在数据区,也不需要申请堆空间。
NSString存储管理--NSTaggedPointerString
iOS 开发之关于__weak修饰NSString以及内存管理的问题(https://blog.csdn.net/shifang07/article/details/54409763)
网友评论