《编写高质量代码:改善Objective-C程序的61个建议》——建议12:清楚常量字符串和一般字符串的区别

简介:

本节书摘来自华章出版社《编写高质量代码:改善Objective-C程序的61个建议》一 书中的第2章,作者:刘一道,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

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

在Objective-C中,经常会用到常量字符串,常量字符串和一般的字符串还是有一定区别的。本节将介绍一些常量字符串的特性,用来加强对常量字符串的理解。请看下面一段代码。

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 initWithString:string1];
if (string2!=string3) {
   NSLog(@"string2 are not same to string3!");
}
if (string1==string3) {
   NSLog(@"string1 are same to string3!");
}

首先,申明上面这一段代码不是一段合法的代码,因为在第2行alloc之后没有立即init。虽然这种做法是非常不推荐的,但这次为了更加清晰地说明问题,不得已而为之。
通过程序比较分析,就会发现string2和string3的地址值竟然不相等,而string1和string3竟然相等。通过这些可看出,如果使用一个常量字符串来初始化另一个字符串,另一个字符串会直接通过地址赋值为常量字符串,alloc的内存也会立即释放。再看看下面这段代码:

NSString *string1 = [[NSString alloc] initWithString:@"Hello"];
[string1 release];
[string1 release];
[string1 release];
NSLog(@"%@",string1);

string1经过多次release竟然还能继续访问,由此说明常量字符串不会release。
 要点
(1)由于编译器的优化,相同内容的常量字符串的地址值是完全相同的。
(2)如果使用常量字符串来初始化一个字符串,那么这个字符串也将是相同的常量。
(3)对常量字符串永远不要release。

相关文章
|
机器学习/深度学习 API iOS开发
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(一)
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(一)
151 0
|
存储 自然语言处理 Java
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(二)
【IOS 开发】Objective-C Foundation 框架 -- 字符串 | 日期 | 对象复制 | NSArray | NSSet | NSDictionary | 谓词(二)
225 0
|
Shell Linux C语言
Windows 下使用 GNUstep 编译并运行 Objective-C 程序
今晚上开始看《Objective-C 程序设计(第4版)》这本书(OSChina 正在做此书的书评活动,详情请看这里),到现在为止看到第 7 章,于是想动手试试写两简单的程序编译跑跑看。
1334 0
|
C语言 iOS开发 程序员
|
程序员 iOS开发
《编写高质量代码:改善Objective-C程序的61个建议》——导读
我一直在思考,如何才能编写出高质量、优秀的代码,我也在不停地探寻,希望找出类似于武侠小说中所说的武功秘籍,在编写代码一途可以帮助大家走“捷径”从而达到事半功倍的效果。
1047 0