美文网首页
ios NSString类族

ios NSString类族

作者: liang1030 | 来源:发表于2020-03-18 15:43 被阅读0次

    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

    相关文章

      网友评论

          本文标题:ios NSString类族

          本文链接:https://www.haomeiwen.com/subject/wwfcyhtx.html