Objective-C中NSString对象的retainCount

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中其他类型的对象一致










  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值