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. 其余的对象参与计数。

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

时间: 2024-10-08 13:51:47

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

深入理解_JVM内存管理对象引用03

1.对象引用: (a)对象状态的判断: <1> 引用计数算法:无法解决对象相互引用的问题. <2> 根搜索算法:主流的判断对象是否存活的算法. (1)基本思路:通过一系列的名为:"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相关联时,证明此对象是不可用的,所以它们将会被判断为是可收回的对象. (2)Java中,GC Roots的对象包括下面几种:

[ PHP 内核与扩展开发系列] 内存管理 —— 引用计数

对于 PHP 这种需要同时处理多个请求的程序来说,申请和释放内存的时候应该慎之又慎,一不小心便会酿成大错.另一方面,除了要安全申请和释放内存外,还应该做到内存的最小化使用,因为它可能要处理每秒钟数以千计的请求,为了提高系统整体的性能,每一次操作都应该只使用最少的内存,对于不必要的相同数据的复制则应该能免则免.我们来看下面这段 PHP 代码: <?php $a = 'Hello World'; $b = $a; unset($a); 第一条语句执行后,PHP 创建了 $a 这个变量,并为它申请了

IOS内存管理

原文链接:http://blog.csdn.net/weiqubo/article/details/7376189 1.  内总管理原则(引用计数)    IOS的对象都继承于NSObject,   该对象有一个方法:retainCount ,内存引用计数. 引用计数在很多技术都用到: window下的COM组件,多线程的信号量,读写锁,思想都一样.       (一般情况下: 后面会讨论例外情况)    alloc      对象分配后引用计数为1    retain    对象的引用计数+1

Objective C 内存管理[转]

1  配对原则 alloc – release new – release retain - release copy – release 2  new和alloc-init的区别 (1)区别只在于alloc分配内存的时候使用了zone. 这个zone是个什么呢? 它是给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度. (2)为什么不推荐使用new 因为若用了new,则初始化方法只能是init.这样,假如你想调用initWithFram

IOS内存管理retain,assign,copy,strong,weak

IOS内存管理retain,assign,copy,strong,weak IOS的对象都继承于NSObject, 该对象有一个方法:retainCount ,内存引用计数. 引用计数在很多技术都用到: window下的COM组件,多线程的信号量,读写锁,思想都一样. (一般情况下: 后面会讨论例外情况)alloc 对象分配后引用计数为1retain 对象的引用计数+1copy copy 一个对象变成新的对象(新内存地址) 引用计数为1 原来对象计数不变 release 对象引用计数-1 如果为

iOS 内存管理基础知识

内存管理问题,首先要知道一个概念,引用计数.Objective-C 的内存管理基于引用计数(Reference Count).如果要使用一个对象,并希望确保在使用期间对象不被释放,需要保证在使用过程中引用计数>0,在使用过后,把引用计数-1.当引用计数==0时,就会调用销毁方法了. 那么我们非常有必要知道,哪些操作会使用引用技术+1,哪些会-1.OK,下面是一个列表: +1操作 alloc - 创建对象是调用alloc,为对象分配内存,对象引用计数加一.. copy - 拷贝一个对象,返回新对象

OC_内存管理:MRC与ARC

内存管理 1.1内存管理 1.1.1 C的内存管理,以及麻烦之处 char *p = (char *)malloc(100*sizeof (char)); 这是C的动态内存分配,我们手动跟系统申请了100个字节的内存:或者说系统在堆里开辟了100个字节的空间,并将这个空间的首地址返回给指针变量p. free(p); 使用完成后,手动跟系统释放内存空间:或者说系统回收空间. 如上就是C里简单的内存管理. C的内存管理,我们手动申请,手动释放.这样来看,我们只需要注意三个问题就好了: 1,申请内存,

iOS-多线程-内存管理

iOS与OSX 多线程和内存管理  总结 一.              自动引用计数 1.自动引用计数(ARC)就是指内存管理中对引用采用自动计数的技术. 满足以下条件即可使用这种功能: Xcode 版本为4.2以上: 使用LLVM编译器 版本为3.0以上: 编译器选项设置ARC为有效: 2.内存管理/引用计数 内存管理的思考方式: 2.1自己生成的对象,自己持有: 2.2非自己生成的对象,自己也能持有: 2.3不需要自己持有的对象时释放: 2.4非自己持有的对象无法释放: 2.1自己生成的对

Objective-C 内存管理(2)

接上篇 内存管理 引用计数 每个对象都有一个与之相关联多整数,被称作它的引用计数器或保留计算器,当某段代码需要访问一个对象时,该代码就将该对象的保留计数器值加1,表示我要访问该对象,当这段代码访问结束的时候,将对象的保留计数器数值减1,表示不再访问该对象了.当保留计数器的值为0时,表示不再有代码访问该对象了,此时它将被销毁同时占用的内存被回收. 对象的保留计数器值初始值为1.当一个对象即将要被销毁的时候,OC会向对象发送一条dealloc消息,这条消息可以在自己的对象中重写. 常见的几种调用方法