在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。