关闭

Objective-C中NSString对象的retainCount

标签: iOS开发ObjectC基础NSString字符串的引用计数
345人阅读 评论(0) 收藏 举报
分类:

Objective-C中NSString对象与其他类型的对象在引用计数上存在着不小的差别。对于NSString的对象,不同的创建方式以及不同的字符个数都会影响对象的引用计数。

1)首先,当字符串的个数小于10个的时候,不管采用哪一种创建方式所得到的字符串都不存在引用计数一说


2)当字符串的长度大于等于10时,开始产生差别(stringWithString的创建方式与字面量方式是一样的)

3)将%ld占位符换成%lu后,会发现,当字符串的长度小于10个的时候,对象的引用计数是64位OS下无符号长整型的最大值


4)当字符串的长度小于10的时候,随着字符串长度的增加,地址会发生很大的变化


5)字符串长度大于10个以后,NSString对象(通过initWithFormt和stringWithFormat创建)与Objective-C中其他类型的对象是一致的,都存在堆区,引用计数会随着retain、release、copy、autorelease和alloc的使用而发生变化


6)通过initWithString、stringWithString(字面量)方式创建的NSString对象并不会随着字符串长度的增加而引起引用计数及地址的变化(地址仍然是在堆区,引用计数仍然是无符号长整型最大值)

7)对于汉字而言,通过initWithString、stringWithString(字面量)方式创建的NSString对象同英文和阿拉伯数字是一致的,没有差别;都是存储在常量区,引用计数仍然是-1(%ld作占位符输出)

8)通过initWithFormat和stringWithFormat创建的NSString汉字字符串对象是与普通对象一致的,引用计数不受汉字个数的影响,存储方式与一般对象一致


综合上述内容:

1)对于通过initWithString和stringWithString(字面量)创建的NSString对象,不管字符串的内容和长度怎么变化,该对象始终是存储在常量区的,没有引用计数一说;硬要加一个引用计数的话,那么就是无符号长整型的最大值

2)对于通过initWithFormat和stringWithFormat创建的NSString对象,如果字符串内容是汉字,那么,该对象和Objective-C中其他类型的对象是一致的;如果字符串内容是非汉字,那么,当字符串长度小于10个时,该对象存储区域在已知的五大区域之外,且随着字符串长度的变化,存储地址会有很大变化;当字符串长度超过10个以后,该对象与Objective-C中其他类型的对象一致










1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:350次
    • 积分:14
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档