首页 > 代码库 > Object-C内存管理-对象引用计数的特例

Object-C内存管理-对象引用计数的特例

看到OC中内存管理这块,其中的引用计数部分,由部分10.5上的EBOOK示例已经在10.9上不能运行正确了,比如下面的代码:

 NSString * str1 = @"string 1";

    NSString * str2 = @"string 2";

    NSMutableString * mstr3 = [NSMutableString stringWithString: @"string 3"];

    NSNumber * int1 = [NSNumber numberWithInteger: 1800000];

    NSNumber * long1 = [NSNumber numberWithLong: 1800000];

    NSNumber * double1 = [NSNumber numberWithDouble: 300.0];

    

    NSLog(@"retain count: str1=%lx, str2=%lx, str3=%lx, int1=%lx, long1=%lx, double1=%lx",

          [str1 retainCount],

          [str2 retainCount],

          [mstr3 retainCount],

          [int1 retainCount],

          [long1 retainCount],

          [double1 retainCount]);

运行结果是:

014-11-07 17:05:22.128 Demo17[9620:303] retain count: str1=ffffffffffffffff, str2=ffffffffffffffff, str3=1, int1=7fffffffffffffff, long1=7fffffffffffffff, double1=1

Program ended with exit code: 0

EBOOK上讲的是常量字符串对象不参与计数,这个是正确的,但是实际运行结果发现,整形的NSNumber对象也好像不参与计数,浮点的NSNumber对象参与计数,即使整形数字很大也不参与计数。Java里面曾经由实现是对小额数字封装对象做缓存,所有小额数字封装对象不参与计数。但是OC里面看起来不是这样的,因为数字已经足够大,不能缓存这么多的整形对象吧?

OC的具体是什么后面再继续研究。

目前总结出的结论是:

1. 常量字符串不参与计数。

2. 常量整形NSNumber对象不参与计数。

3. 其余的对象参与计数。

 

打完收工,有问题再记录~

Object-C内存管理-对象引用计数的特例