三、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)内存管理模块,可以在当前资源满足的情况下,根据用户的需求分配任意大小的内存块.而当用户不需要再使用这些内存块时,又可以释放回堆中供其他应用分配 ...
随机推荐
- HTML6即将到来,你没有看错是HTML6
HTML6提案1:对视频对象的更多控制 我们可能永远不会解决与压缩编解码器的争斗,但我们可以与之配合.不同的压缩算法可能需要更多的工作来实现,但是它们提供竞争.能对展现在页面上的视频帧提供更多控制的方 ...
- 【3dsMax安装失败,如何卸载、安装3dMax 2017?】
是不是遇到MAYA/CAD/3DSMAX/INVENTOR安装失败?AUTODESK系列软件着实令人头疼,MAYA/CAD/3DSMAX/INVENTOR安装失败之后不能完全卸载!!!(比如maya, ...
- Sean McGinnis
* Loaded log from Wed Nov 25 22:19:43 2015 * Now talking on #openstack-smaug* [smcginnis] (~smcginni ...
- Trace Logging Level
Trace In functions which support this level, details every parameter and operation to help diagnose ...
- Hadoop学习笔记(3) Hadoop I/O
1. HDFS的数据完整性 HDFS会对写入的所有数据计算校验和,并在读取数据时验证校验和.datanode负责在验证收到的数据后存储数据及其校验和.正在写数据的客户端将数据及其校验和发送到由一系列d ...
- [转].Net Core上用于代替System.Drawing的类库
本文转自:http://www.tuicool.com/wx/iuaINjy 目前.Net Core上没有System.Drawing这个类库,想要在.Net Core上处理图片得另辟蹊径. 微软给出 ...
- NET平台4.0 发布网站流程及出错总结
1.进入IIS设置,在控制面板中选择“管理工具”,进入后选择 “Internet 信息服务(IIS)管理器” 2.点击[添加]应用程序池,根据版本选择framework 3.添加网站 ,右击网站,添加 ...
- java实现汉字转为拼音
java实现汉字转为拼音: 1.需要导入pinyin4j.jar package com.loo.pinyin; import net.sourceforge.pinyin4j.PinyinHelpe ...
- 斗鱼扩展--notifications提示(十二)
来说下 桌面通知 Notification,HTML5支持 Web Notifications 的实例,但是要经过用户允许, chrome://settings/content/notificati ...
- WCF:无法满足对安全令牌的请求,因为身份验证失败。
服务端和客户端如果有认证的话的这样: <wsHttpBinding> <binding name="WSHttpBinding_IService1" closeT ...