ios 内存管理的理解(一) 简述
1. 内存管理的范围
- 所有的OC对象(继承自NSObject类)
本质原因:是因为对象和其他数据类型在系统中的存储空间不一样,其他局部变量主要存放于栈中,而对象存储于堆中。 当代码块结束时,这个代码块中涉及的所有局部变量会被回收,指向对象的指针也被回收,此时,对象已经没有指针指向,但依然存在于内存中,就会造成内存泄露
2. 我们如何对OC对象进行内存管理?
- 通过操作对象的"引用计数器"
3. 引用计数器
3.1 什么是引用计数器?
- 1> 每个OC对象都有自己的引用计数器
- 2> 它是一个整数(long类型, 占用8个字节)
- 3> 从字面上, 可以理解为"对象被引用的次数"
- 4> 也可以理解为: 它表示有多少人正在用这个对象
3.2 引用计数器的作用?
- 系统通过"引用计数器"来判断当前对象是否可以被释放
对象的"引用计数器"的操作方式 - 1> retain, +1
- 2> release, -1
- 3> retainCount, 获取对象引用计数器的值
4. dealloc方法
- 当对象即将被销毁, 系统自动给对象发送一条dealloc消息
- 因此, 从dealloc方法有没有被调用,就可以判断出对象是否被销毁
- 重写了dealloc方法, 必须调用[super dealloc],并且放在最后面调用,不要自己直接调用dealloc方法
5. 野指针\空指针\僵尸对象
- 僵尸对象: 已经被销毁的对象(不能再使用的对象)
- 野指针: 指向僵尸对象(不可用内存)的指针
- 空指针: 没有指向存储空间的指针(里面存的是nil, 也就是0)
- 注意: 给空指针发消息是没有任何反应的, 不会提示出错 nil Nil NULL [NSNULL null];
6. 多对象内存管理
set方法的内存管理 -(void)setCar:(Car*)car{ if( _car != car){ [_car release]; _car = [car retain]; } }
- dealloc方法的内存管理
-(void)dealloc{ [_car release]; [super dealloc]; }
7. 苹果官方的内存管理原则:
- 谁创建谁release,
- 如果你通过alloc、new或copy、mutableCopy来创建一个对象
- 那么你必须调用release或autorelease
- 谁retain谁release
- 只要你调用了retain, 就必须调用一次release
8. @property的修饰关键字
1> 控制set方法的内存管理
- retain: release旧值,retain新值(用于OC对象),要配合nonatomic使用
- assign: 直接赋值,不做任何内存管理(默认,用于非OC对象类型)
- copy: release旧值, copy新值(一般用于NSString *)
2>控制是否需要生成set方法
- readwrite: 同时生成set方法和get方法(默认)
- readonly: 只会生成get方法
3> 多线程管理
- atomic: 性能低(默认)
- nonatomic: 性能高(为iOS系统开发软件建议使用,为mac开发软件可以使用atomic)
4> 控制set方法和get方法的名称
- setter: 设置set方法的名称, 一定有个冒号:
- getter: 设置get方法的名称
9. @class用法
- 为什么要使用@class .h
- 通过@class解决循环依赖问题
10. 内存管理时的循环retain问题
- 解决办法: 一端用retain、一端用assign
- 注意: 使用了assign后, dealloc中就不需要release了
11.自动释放池简介
1.自动释放池的创建
- 第一种
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; // 代码 [pool release]; //[pool drain];用于mac
- 第二种
@autoreleasepool { //开始代表创建自动释放池 } //结束代表销毁自动释放池
2.自动释放池的好处
- 不需要关心释放时间
- 不需要关系什么时候release
3.autorelease基本用法
- (1)会将对象放到一个自动释放池中
- (2)当自动释放池被销毁时,会对池子里的所有对象做一次release
- (3)会返回对象本身
- (4)调用完autorelease方法后,对象的计数器不受影响(销毁时影响)

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
netty01(长短连接、java)
使用netty需要添加依赖包 netty版本:netty-5.0.0.Alpha2http://files.cnblogs.com/files/applerosa/netty-5.0.0.Alpha2.7z maven依赖: io.nettynetty-all5.0.0.Alpha2 这个案例采用的是idea编辑器,maven管理项目,也可以直接采用普通项目进行测试,只需要将对应的jar包添加进去即可。 接下来我们要搞清楚,netty是什么玩意。 官方那个给出的介绍是:Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 然后我们简单理解一下,这玩意就是个程序,干什么的?netty是封装java socket noi的。 类似的功能是 apache的mina。 相对于Tomcat这种Web Server(顾名思义主要是提供Web协议相关的服务的),Netty是一个Network Server,是处于Web Server更下层的网络框架,也就是说你可以使用Netty模...
- 下一篇
ios 自定义View 卡片滑动切换效果
说明 控件基于UIView封装完成,采用UIPanGestureRecognizer监听自身的触摸事件,以此处理各种滑动动画操作。 内容之间可以循环切换,采用类似tableView加载机制,达到复用效果 效果 代码实现 #import <UIKit/UIKit.h> @class SMSwipeView; @protocol SMSwipeDelegate <NSObject> @required //获取显示数据内容 -(UITableViewCell*)SMSwipeGetView:(SMSwipeView*)swipe withIndex:(int)index; //获取数据源总量 -(NSInteger)SMSwipeGetTotaleNum:(SMSwipeView*)swipe; @end @interface SMSwipeView : UIView @property(nonatomic,weak)id<SMSwipeDelegate> delegate; //层叠透明方式显示 默认NO @property(nonatomic,ass...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- 设置Eclipse缩进为4个空格,增强代码规范
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程