美文网首页iOS基础·OC语法篇
建议12:iOS清楚常量字符串和一般字符串的区别

建议12:iOS清楚常量字符串和一般字符串的区别

作者: 花生儿 | 来源:发表于2016-04-25 01:46 被阅读696次

    在oc中,经常会用到常量字符串,常量字符串和一般字符串还是有一定区别的。

    NSString * string1 = @"Hello";
    NSString * string2 = @"Hello";
    if (string1 == string2) {
        NSLog(@"They are same address");
    }
    

    对字符串常量string1 和string2进行比较,就会发现,二者竟然是相等的。产生这样的原因要归咎于编译器优化的结果。

    由于常量会占用一块特殊的代码段,加载到内存时,就会映射到一块常量存储区,以加快访问速度。编译器在编译时会发现,string1和string2的内存是相同的常量字符串,会把他们都指向相同的一个区域,而不是开辟出一个额外的内存空间。因此他们的地址是相同的。

    再看看这段代码:

    NSString * string1 = @"Hello";
    NSString * string2 = [NSString alloc];
    NSString * string3 = [string2 initWintStirng:string1];
    if (string2 != string3){
          NSLog(@"string2 are not asme to string3!");
    }
    if (string1 == string3){
         NSLog(@"string1 are same to string3!");
    }
    

    首先,申明上的这一段代码不是一段合法的代码,因为在第二行alloc之后,没有立即init。虽然这种做法是非常不推荐的,但是这次为了更清晰的说明问题,不得已而为之。

    通过程序比较分析,就是发现string2和string3的地址值竟然不相等,而string1和string3竟然相等。通过这些可看出,如果使用一个常量字符串来初始化另一个字符串,另一个字符串会直接通过地址赋值为常量字符串,alloc的内存也会立即释放。

    另外,常量字符串不会release。

    要点###

    (1)由于编译器的优化,相同内容的常量字符串的地址值是完全相同的。
    (2)如果使用常量字符串来初始化一个字符串,那么这个字符串也是相同的常量。
    (3)对常量字符串来说,永远不要release。

    相关文章

      网友评论

        本文标题:建议12:iOS清楚常量字符串和一般字符串的区别

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