NSString是一个类簇(Class Clusters),最后生成的对象类型,取决于我们调用的初始化方法。不同的对象类型的管理方式不一样(在retainCount上有所体现)
类型 | 初始化后的retaincount |
---|---|
__NSCFConstantString | -1 |
__NSCFString | 1 |
__NSTaggedPointerString | -1 |
1, 对于__NSCFConstantString,系统进行维护,retain和release不起作用(程序中内容相同的常量字符串只有一个)
2,__NSCFString与其他oc对象一样维护retainCount
3,__NSTaggedPointerString,retain/release不起作用
NSString *a = @"a";
NSString *c = [a copy];
NSLog(@"%p %p", a,c);//输出两个相同的地址,并没有真正的复制
例子:
一,__NSCFConstantString
1,@""格式的字符串
NSString *str1 = @"string";//__NSCFConstantString
NSLog(@"str1:%d",[str1 retainCount]);// -1
NSLog(@"[str1 class]: %@",[str1 class]);//__NSCFConstantString
2,stringWithString+__NSCFConstantString
NSString *str3 = [NSString stringWithString:@"str3"];//__NSCFConstantString
NSLog(@"str3:%d",[str3 retainCount]); // -1
NSLog(@"[str3 class]: %@",[str3 class]);//__NSCFConstantString
二,__NSTaggedPointerString
1,
NSString *str2 = [NSString stringWithFormat:@"%s", "str2"];//__NSTaggedPointerString
NSLog(@"str2:%d",[str2 retainCount]); // -1
2,
NSString *a = @"a";
NSString *b = [[a mutableCopy] copy];//__NSTaggedPointerString
NSLog(@"b:%d",[b retainCount]); // -1
三,__NSCFString
1,通过stringWithFormat构造
NSString *str2_2 = [NSString stringWithFormat:@"%s,%d", "str2_2",22];//__NSCFString
NSLog(@"str2_2:%d",[str2_2 retainCount]); //1
2,stringWithString + stringWithFormat
NSString *str4_2 = [NSString stringWithString:[NSString stringWithFormat:@"hahah"]];//__NSCFString
NSLog(@"str4_2:%d",[str4_2 retainCount]); // 1
NSString *str4_1_1 = [NSString stringWithString:[NSString stringWithFormat:@"%s", "str2"]];
NSLog(@"str4_1_1:%d",[str4_1_1 retainCount]); //1
NSString *str4 = [NSString stringWithString:[NSString stringWithFormat:@"%s,%d", "str4",22]];//__NSCFString
NSLog(@"str4:%d",[str4 retainCount]); // 1
3,stringWithString+__NSTaggedPointerString对象
NSString *str2 = [NSString stringWithFormat:@"%s", "str2"];//__NSTaggedPointerString
NSString *str4_1_1 = [NSString stringWithString:[NSString stringWithFormat:@"%s", "str2"]];
NSLog(@"str4_1_1:%d",[str4_1_1 retainCount]); //1
4,stringWithString+__NSCFString对象
NSString *str2_2 = [NSString stringWithFormat:@"%s,%d", "str2_2",22];//__NSCFString
SString *str4_3 = [NSString stringWithString:str2_2];
NSLog(@"str4_3:%d",[str4_3 retainCount]); //2
5,NSMutableString对象
NSMutableString* str5 = [NSMutableString stringWithString:@"str5"];//__NSCFString
NSLog(@"str5:%d",[str5 retainCount]); //1
总结:
1,retainCount的不同本质上是因为NSString类簇返回的子类的不同,__NSCFConstantString 和__NSTaggedPointerString初始值为-1,__NSCFString为1
2,亦可通过方法来区分得到的字符串的类型
2.1,@”“格式得到的为常量字符串
2.2,stringWithFormat得到的可能为__NSCFConstantString或者__NSTaggedPointerString
2.3,stringWithString
2.3.1,stringWithString+__NSCFConstantString得到__NSCFConstantString
2.3.2,stringWithString+stringWithFormat得到__NSCFString,初始计数值为1
2.3.3,stringWithString+__NSTaggedPointerString对象得到__NSCFString,初始计数值为1
2.3.4,stringWithString+__NSCFString对象得到__NSCFString,初始计数值为2
参考:https://www.cnblogs.com/rainySue/p/NSString-yu-qi-guai-deretainCount.html
网友评论