三、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)内存管理模块,可以在当前资源满足的情况下,根据用户的需求分配任意大小的内存块.而当用户不需要再使用这些内存块时,又可以释放回堆中供其他应用分配 ...
随机推荐
- select获取到option的value和text方法
function getSelectval(id){ var selId = document.getElementById(id); //获取select的id var seleIndex =sel ...
- leetcode 196. Delete Duplicate Emails 配合查询的delete
https://leetcode.com/problems/delete-duplicate-emails/description/ 题意要对原来的数据表进行删除,不删除不行,它每次只输出原来那个表. ...
- (转)AIX下修改用户最大进程数
AIX下修改用户最大进程数 原文:http://blog.csdn.net/feichideche/article/details/39498555 使用AIX时候,切换用户,发现进程一直挂起,查看用 ...
- shell脚本之文件测试操作符及整数比较符
一.文件测试操作符: 在书写测试表达式是,可以使用一下的文件测试操作符. 更多的参数可以help test或者man bash 二.字符串测试操作符: 字符串测试操作符的作用:比较两个字符串是否相同. ...
- 但是你没有【But you didn't.】【by Anonymous】
作者是一位普通的美国妇女,她的丈夫在女儿4岁时应征入伍去了越南战场,从此她便和女儿相依为命.后来,她的丈夫.孩子的爸爸不幸阵亡.她终身守寡,直至年老病逝.她女儿在整理遗物时发现了母亲当年写给父亲的这首 ...
- js弹出页面
建立一个HTML文件,输入以下代码就能弹出页面 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- 多列转1列 SqlServer 实现oracle10g的 wmsys.wm_concat()--for xml path('')
有这么一个表 )) , 'aa') , 'bb') , 'aaa') , 'bbb') , 'ccc') , 'ddd') , 'fff') ...
- Html+CSS--->第一周初探
html css 学了一周的前端,谈谈我的感想 我一直在使用sublime text 3来编辑我的代码,其中有很多很好用的快捷键和插件大大提高了我的开发效率 在这里我极力推荐使用编辑器来进行学习前端. ...
- CentOS 上安装 GIT 服务
获取 YUM 中 GIT 信息: yum info git 查看当前 GIT 的版本: git --version 或 git version 卸载当前版本的 GIT: ...
- 一道Java集合框架题
问题:某班30个学生的学号为20070301-20070330,全部选修了Java程序设计课程,给出所有同学的成绩(可用随机数产生,范围60-100),请编写程序将本班各位同学的成绩按照从低到高排序打 ...