OC语法6——内存管理之引用计数器(retain,release)
2015-02-21 06:43
381 查看
OC内存管理:
一、引用计数器:
Java有垃圾回收机制(Garbage Collection,GC)。也就是说当我们创建对象后,不需要考虑回收内存的事,Java的垃圾回收机制会自动销毁该对象,回收它占用的内存。
但OC没有垃圾回收机制,需要开发者手动销毁创建的对象,收回内存。OC中没有垃圾回收机制,而是通过“引用计数器”来管理内存的。
引用计数器:OC中的对象内部都有一个记录有关对象内存状态的整数,把这个整数就叫做引用计数器。
当调用alloc,new,copy等创建新对象时,计数器置为1;当调用retain时计数器便加1;当调用release是计数器便减1;
当计数器为0时,系统会自动调用dealloc方法,销毁该对象,释放占用的内存。
————————————————————————————————————————
二、分析对象的引用计数器:
因为没有Xcode写代码的例子,所以先把“内存管理的原则”的总结放在开学后。在这里先列出大纲:
1.通过引用计数器分析对象不同阶段引用计数器的值(retainCount);
2.内存管理的原则是“谁创建,谁释放”,怎么深刻理解这句话?
真实开发环境中对象的调用时错综复杂的,那我们该如何进行内存管理,该如何理解“谁创建,谁释放”?(set方法里调用retain,重写的realloc里调用release)
三、自动释放池:
为了便捷,OC也提供了一种半自动回收内存机制,即“自动释放池”。
首先通过@autoreleasepool{ }定义一个代码块,这就是“自动释放池”;
然后在创建对象时只要调用autorelease方法,则就相当于把该对象放入自动释放池。
当代码块执行完后,会一次性的对放入其中的所有对象调用一次release方法,从而可以起到自动释放内存的功能。
自动释放池的本质:
自动释放池和Java的垃圾回收机制是不同的。它的本质是对放入“池”中的对象统一调用一次release方法。
所以,也需要注意,并不是说放入池中的对象就一定会被销毁。(假如该对象调用过retain方法,放入池时计数器为2,则通过自动释放池统一调用release后,计数器为1,该对象并不会被销毁)
因为自动释放池延迟了对象的销毁,而进行统一销毁。当对象很多或者占很大内存时不宜采用自动释放池,不应该让他们长期驻留。
需要说明的是,OC类库中的静态方法一般不需要手动释放,内部已经调用了autorelease方法。
一、引用计数器:
Java有垃圾回收机制(Garbage Collection,GC)。也就是说当我们创建对象后,不需要考虑回收内存的事,Java的垃圾回收机制会自动销毁该对象,回收它占用的内存。
但OC没有垃圾回收机制,需要开发者手动销毁创建的对象,收回内存。OC中没有垃圾回收机制,而是通过“引用计数器”来管理内存的。
引用计数器:OC中的对象内部都有一个记录有关对象内存状态的整数,把这个整数就叫做引用计数器。
当调用alloc,new,copy等创建新对象时,计数器置为1;当调用retain时计数器便加1;当调用release是计数器便减1;
当计数器为0时,系统会自动调用dealloc方法,销毁该对象,释放占用的内存。
————————————————————————————————————————
二、分析对象的引用计数器:
因为没有Xcode写代码的例子,所以先把“内存管理的原则”的总结放在开学后。在这里先列出大纲:
1.通过引用计数器分析对象不同阶段引用计数器的值(retainCount);
2.内存管理的原则是“谁创建,谁释放”,怎么深刻理解这句话?
真实开发环境中对象的调用时错综复杂的,那我们该如何进行内存管理,该如何理解“谁创建,谁释放”?(set方法里调用retain,重写的realloc里调用release)
三、自动释放池:
为了便捷,OC也提供了一种半自动回收内存机制,即“自动释放池”。
首先通过@autoreleasepool{ }定义一个代码块,这就是“自动释放池”;
然后在创建对象时只要调用autorelease方法,则就相当于把该对象放入自动释放池。
当代码块执行完后,会一次性的对放入其中的所有对象调用一次release方法,从而可以起到自动释放内存的功能。
自动释放池的本质:
自动释放池和Java的垃圾回收机制是不同的。它的本质是对放入“池”中的对象统一调用一次release方法。
所以,也需要注意,并不是说放入池中的对象就一定会被销毁。(假如该对象调用过retain方法,放入池时计数器为2,则通过自动释放池统一调用release后,计数器为1,该对象并不会被销毁)
因为自动释放池延迟了对象的销毁,而进行统一销毁。当对象很多或者占很大内存时不宜采用自动释放池,不应该让他们长期驻留。
需要说明的是,OC类库中的静态方法一般不需要手动释放,内部已经调用了autorelease方法。
相关文章推荐
- 黑马程序员_object c学习日记③_SEL数据、内存管理一:引用计数器、retain、release、dealloc等
- OC_语法入门_day5_内存管理_计数器/set方法/property的参数/循环引用/自动释放池
- 内存管理一道数组存储例题存储精讲! (oc手动管理内存,引用计数器)
- 第十二篇:OC中的对象内存管理都是对 对象引用计数器 进行管理
- 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,reado
- OC-内存管理-基本原理与引用计数器
- 黑马程序员——OC基础---内存管理(引用计数器,多对象内存管理,set方法的内存管理,模型设计,循环引用)
- 4、内存管理(retain点语法)-OC
- OC基础—内存管理之引用计数器
- 关于OC中得内存管理问题,alloc,retain,release,copy,dealloc
- 【OC学习-11】ARC和内存管理里面的alloc、assign、new、retain、copy、mutableCopy、release说明
- OC对象的retainCount(引用计数器)
- OC 内存管理(retain和release)
- OC学习笔记四-1 内存管理(Retain-Release)
- 【OC. 内存管理】retain和release
- 【语法】【内存管理】retain和release
- OC基础-内存管理-引用计数器+set方法
- 黑马程序员——IOS基础——OC内存管理循环retain和autorelease
- 黑马视频学习笔记-内存管理-引用计数器
- OC基础15:内存管理和自动引用计数