三、Object-C内存管理
一、管理范围:任何继承了NSObject的对象,对基本数据类型无效
原理:
1.每个对象都有个引用计数器,是一个与之关联的整数
2.使用了
3.给对象发送一条retain消息,可以使对计数器+1
4.给对象发送一条release消息,可以使对计数器-1
5.当一个对象的的引用计数器的值为时,那么它将被销毁,OC也会自动向对象发送一条dealloc消息。一般会重写dealloc方法(类似遗言遗言),一定不要直接调用dealloc方法
- (void)dealloc{
NSLog(@"%@被销毁了",self);
[superdealloc];//一定要调用super的dealloc方法,而且最好放在最后面调用
}
6.可以给对象发送retainCount消息获得当前的引用计数器值
NSLog(@"count=%zi",[obj retainCount]);
二、内存管理的原则
1.谁创建,谁释放,如果你通过alloc,new或者copy创建一个对象,那么你必须调用release或autorelease,不是你创建的,就不用去释放
2.一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease
3.谁retain,谁release,如果调用了retain,就算没创建对象,也要release
三、自动释放池(autorelease pool)
自动释放池是OC里面一种内存自动回收机制,一般可以将一些临时变量添加到自动释放池中,统一回收释放。
当自动释放池销毁,池里所有对象都会调用一次release方法
如何将对象加入自动释放池?
OC对象只需要发送一条autorlease消息,就会把这对象添加到最近的自动释放池中(栈顶的释放池)
autorelease实际上只是把对release的调用延迟了,系统只是把对象放入到池中,当池被释放时,所有池中对象就会调用一次release
//@autoreleasepool代表创建一个自动释放池(IOS5后)
@autoreleasepool{
Student *stu = [[[Student alloc] init] autorlase];
}
一般可以写一个创建对象的静态方法
+ (id)student{//潜规则,方法名和类名一致,开头字母改为小写
Student *stu = [[[Student alloc] init] autorlase];
return stu;
}
autoreleasepool注意
1.不要把大量循环操作昂到同一个自动释放池(NSAutoreleasePool)之间,这样会造成内存峰值上升
2.尽量避免打对大内存使用该方法
3.SKD中一般利用静态方法创建的对象都已经是 autorelease的,不需要在进行release操作
三、Object-C内存管理的更多相关文章
- 分布式缓存技术memcached学习(三)——memcached内存管理机制
几个重要概念 Slab memcached通过slab机制进行内存的分配和回收,slab是一个内存块,它是memcached一次申请内存的最小单位,.在启动memcached的时候一般会使用参数-m指 ...
- 分布式缓存技术memcached学习系列(三)——memcached内存管理机制
几个重要概念 Slab memcached通过slab机制进行内存的分配和回收,slab是一个内存块,它是memcached一次申请内存的最小单位,.在启动memcached的时候一般会使用参数-m指 ...
- OC第三天(内存管理)
内存管理: 1.作用范围: 不论什么继承了NSObject的对象,堆基本数据类型无效如:int a ,float price;;等 2.原理: 每一个对象内部都保存了一个与之相关的整数,称为引用计数器 ...
- DPDK内存管理-----(三)rte_malloc内存管理
rte_malloc()为程序运行过程中分配内存,模拟从堆中动态分配内存空间. void * rte_malloc(const char *type, size_t size, unsigned al ...
- cocos2d-x内存管理
Cocos2d-x内存管理 老师让我给班上同学讲讲cocos2d-x的内存管理,时间也不多,于是看了看源码,写了个提纲和大概思想 一. 为什么需要内存管理 1. new和delete 2. 堆上申 ...
- 理解CPU内存管理
概述:从设计层面理解CPU的内存模式,包括段式内存管理.页式内存管理以及虚拟化扩展内存管理.实际上,硬件支持与软件实现从来就不是能分开讲的,比如,Intel CPU架构师在选择CPU的硬件特性时,必然 ...
- Windows内存管理[转]
本文主要内容:1.基本概念:物理内存.虚拟内存:物理地址.虚拟地址.逻辑地址:页目录,页表2.Windows内存管理3.CPU段式内存管理4.CPU页式内存管理 一.基本概念1. 两个内存概念物理内存 ...
- 【Spark-core学习之八】 SparkShuffle & Spark内存管理
[Spark-core学习之八] SparkShuffle & Spark内存管理环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 ...
- RT-thread内核之小内存管理算法
一.动态内存管理 动态内存管理是一个真实的堆(Heap)内存管理模块,可以在当前资源满足的情况下,根据用户的需求分配任意大小的内存块.而当用户不需要再使用这些内存块时,又可以释放回堆中供其他应用分配 ...
随机推荐
- 从c到cpp对static 关键字的总结 需要整理下!!!!!!!!!!!!!!!!!!!!!!
一个完整的程序,在内存中的分布情况如下: 具体分布图 自己看书去!!!!!1.栈区: 由编译器自动分配释放,像局部变量,函数参数,都是在栈区.会随着作用于退出而释放空间.3.堆区:程序员分配并 ...
- sysbench测试MySQL筛选tps
log=$1tps_array=`awk -F '[,:]' '{print $4}' ${log}`zero=0 for tps in ${tps_array}do tps=`echo ${tps} ...
- 性能测试工具Jmeter04-脚本录制
Jmeter脚本录制:不推荐使用,这里就不介绍了 Badboy脚本录制 下载地址:http://www.badboy.com.au Badboy是一个强大的工具,旨在帮助测试和开发复杂的动态应用.Ba ...
- dom4j使用
http://www.cnblogs.com/zfc2201/archive/2011/08/16/2141441.html http://www.blogjava.net/i369/articles ...
- java语言编程实现两个时间相差多少天、多少小时、多少分、多少秒
不多说,直接上干货! DateDistance.java package zhouls.bigdata.DataFeatureSelection.test; import java.text.Date ...
- jQuery.hover() 函数详解
hover()函数用于为每个匹配元素的hover事件绑定处理函数. hover事件就是鼠标悬停事件.此外,你还可以额外传递给事件处理函数一些数据. 此外,你可以为同一元素多次调用该函数,从而绑定多个事 ...
- windows中的ubuntu
摘要 windows的cmd 实在是太难用,对于码农来说还是喜欢linux的命令行,功能强大:但是linux下的办公软件又没有windows下的强大,在windows下安装个虚拟机吧太卡了: 所以出了 ...
- C#中 计时器用法 运行时间
有时候我们会需要计算某段代码运行的时间 比如一个sql查询,记录一段代码所花费的时间等等代码如下: System.Diagnostics.Stopwatch watch = new System.Di ...
- ASP.NET前端调用后台方法
<script> function MyConfirm() { if (confirm('存在重复记录,覆盖点继续,不覆盖追加保存点取消')) { ...
- Graphics绘制类及打印机设置相关
Graphics 有两个多个方法 这里面介绍3个: 1.Graphics.drawString():绘制.画字符串........... e.Graphics.DrawString("新乡市 ...