理解Object-C中字符串

在Objective-C中我们常常会用到常量字符串,常量字符串和一般的字符串还是有一定区别,本文将介绍一些常量字符串的特性,加强你的常量字符串的认识。请看下面一段代码。

1
2
3
4
5
NSString *string1 = @"Hello" ;
NSString *string2 = @"Hello" ;
if (string1==string2) {
     NSLog ( @"They are same address" );
}

你将会得到string1和string2的地址值竟然是相等的,这是编译器优化的结果。由于常量会占用一块特殊的代码段,加载到内存时会映射到一块常量存储区,以加快访问速度,编译器在编译时发现string1和string2的内容是相同常量字符串,会把它们都指向一个相同的区域,而不是再开辟出一块额外的空间。因此它们是相同的地址值。
在看看这段代码:

1
2
3
4
5
6
7
8
9
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的内存也会立即释放。
再看看下面这段代码:

1
2
3
4
5
NSString *string1 = [[ NSString alloc ] initWithString : @"Hello" ];
[string1 release ];
[string1 release ];
[string1 release ];
NSLog ( @"%@" ,string1);

string1经过多次release竟然还能继续访问?由此说明常量字符串不会release。

综上所述,常量字符串由以下特性:

  • 由于编译器的优化,相同内容常量的地址值是完全相同的。
  • 如果使用常量字符串来初始化一个字符串,那么这个字符串也将是相同的常量。
  • 常量字符串永远不会release。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值