理解Object-C中字符串
来源:互联网 发布:mac os get ipaddress 编辑:程序博客网 时间:2024/06/05 13:17
在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。
- 理解Object-C中字符串
- Object-c 中字符串总结
- Object-c 中字符串总结
- Object-C中 Self 关键字的理解
- Object-c 中字符串NSString、NSMutableString总结
- Object-c NSString 字符串
- Object-c 之 字符串
- Object-C—字符串
- Object-C 字符串
- Object-C 字符串对象
- Object-C 之 字符串
- Object-C 字符串
- Object-C中对“引用(reference)”的理解
- Object - c 中 @public @protected @private的理解
- Object-C中description方法的理解与应用
- 深入理解object C中复制对象的用法
- 深入理解Objective-C中字符串常量
- Object-c 中字符串与数组的处理
- javascript55个技巧
- j2ee 规范的接口和实现 到底在哪能找到
- C语言精华记录——陆(结构、联合、位段、位级操作)
- 独处也是一种享受,让自己做回自己……
- 开始写博客了。
- 理解Object-C中字符串
- 从sourceforge迁移到github
- 想起那些瞬间,还是会心痛
- 1个POST表单里面有两个submit分别提交不同的内容,后天如何区分呢?(jung)
- 终极优化你的游戏 —— 使用脏矩形技术
- navicat连接oracle 报 ORA-12737 set CHS16GBK
- 大杂烩
- jquery 文字自动补全(文本自动补全)
- 需要什么样的文档