Tags: Objective-C, iOS, 修饰词
Demo: https://github.com/lishangjing-dmeo/AssignObjectDemo
通常用于修饰基础数据类型(如NSInteger、BOOL等)和C数据类型(如int、float,double等)
常用与基本数据类型,也可以作用在对象类型
若作用与对象类型时,会存在野指针的情况,所以我们平时不会通过 assign 来修饰对象类型
遇到的问题:
当我尝试用 NSString 和 NSObject 分别来复现该结论时,发现 NSString 并没有复现野指针问题,我创建 NSString 的方式是,创建方式导致我无法复现
NSString *str2 = [NSString stringWithFormat:@"123"];
扩展&解决问题:
这里的对象类型中,NSString 存在特殊的情况
- NSString 不同的创建方式,会创建不同的 NSString 对象 →
- 不同的 NSString 对象,会决定内存被存放的位置 →
- 不同的存放位置决定是否会发生野指针(仅存放在堆中的对象会发生野指针)。
NSString *str1 = [NSString stringWithFormat:@"小强"];
NSString *str2 = [NSString stringWithFormat:@"1"];
NSString *str3 = [NSString stringWithFormat:@"a"];
NSString *str4 = @"123456789";
__NSCFConstantString
显然是常量字符串,自然就是存储在常量区
__NSCFString
表示为oc对象,NSString就是封装的CFString,0x6000000315c0
地址显示这个字符串对象存储在堆中
NSTaggedPointerString
这个类表示这是字符串的一种指针Tagged Pointer。
Untitled 1.png引用文章:
网友评论