OC - 5.内存管理
一、引用计数器
1> 栈和堆
栈
① 主要存储局部变量
② 内存自动回收堆
① 主要存储需要动态分配内存的变量
② 需要手动回收内存,是OC内存管理的对象
2> 简介
作用
① 表示对象被引用的次数
② 通常由alloc、new、copy与release方法引发
③ 动态监测引用计数器的值,当值为0时回收对象所占的内存使用注意
① 引用计数器一个NSUInteger类型的变量,占用4字节内存
② 在对象被创建的时候引用计数器的值被初始化为1
③ 每个使引用计数器加1的操作,都有一个引用计数器减1的操作与之
对应
3> 基本概念
僵尸对象
① 所占用的内存已经被回收的对象
② 僵尸对象不能再被使用野指针
① 指向僵尸对象的指针
② OC中引用野指针会报错,错误信息:EXC_DAB_ACCESS空指针
① 没有指向任何内存地址的指针
② 空指针的值通常为nil、NULL或0
③ 通常在创建指针时将其初始化,避免其指向不确定的内存
④ 在对象被销毁后,通常要将指向对象的指针赋值为nil,避免产生野
指针
4> 基本方法
retain
① 使引用计数器加1
② alloc、new、copy等方法会自动调用retain方法
③ 每个retain方法都必须对应一个release方法
④ 返回值为对象本身release
① 使引用计数器减1
② 没有返回值
③ 用空指针调用release方法不会报错
④ 不是经过alloc方法创建的对象,不需要执行release操作dealloc
① 在对象被销毁时调用
② 通常需要重写dealloc方法
③ 重写dealloc方法时,必须在最后调用父类的dealloc方法
④ @property不会影响dealloc方法,只会影响色图特人和getter
二、多对象内存管理
1> 基本使用
- 当拥有某个对象时,就对该对象执行retain操作
- 当抛弃某个对象时,就对该对象执行release操作
- 谁执行retain操作,谁就执行release操作
2> set方法的内存管理
基本使用
① 当set方法的参数是OC对象时,通常要在set方法内实现内存管理
② 当参数与成员变量不一样时,才对成员变量执行release操作,对
参数执行retainset方法的代码规范
① 基本数据类型:直接赋值
② OC对象类型
)先判断是不是新对象
)若是,对就对象执行一次release操作,对新对象执行一次retain
操作
)否则,不执行操作dealloc方法的代码规范
① 对self拥有的所有对象执行一次release操作
② 一定要调用父类的dealloc方法,且放在最后
③ 在ARC环境下重写dealloc方法不能调用父类的dealloc方法
3> @property对内存的影响
基本使用
① 为成员变量生成setter和getter
② 默认生成的setter执行的是直接赋值,不涉及内从管理
③ 若setter的参数是OC对象,需要设置@property的参数,使其生成
内存管理代码@property的参数
① 内存管理相关参数
)retain:release旧对象,retain新对象(适用于OC对象类型)
)assign:直接赋值(默认,适用于非OC对象)
)copy:release旧对象,copy新对象 ② 控制成员变量属性的参数
)readwrite:同时生成setter和getter的声明、实现
)readonly:只会生成getter的声明、实现 ③ 多线程管理相关参数
)nonatomic:生成setter方法时不加线程管理代码,性能高
(一般用这个)
)atomic:生成setter方法时加上线程管理代码,性能低(默认) ④ 指定setter和getter名称的参数
)通过setter指定生成的set方法的名称,通过getter指定生成的
get方法的名称
)不影响点语法的使用,点语法在使用时先转换为对应的set或get
方法
)通常当get方法的返回值为BOOL类型数据时,对get方法使用,
set方法几乎不用
4> 循环包含与循环引用
循环包含
① 但两个类的声明文件循环包含时,通常要在一个文件中用@class
声明另一个类
② 使用规范
)在.h文件中用@class声明类
)在.m文件中用#import包含类的声明文件循环引用
① 当两个OC类循环引用时,会产生内存管理问题
② 解决方法
)在一个类的声明中,指定@property的内存管理参数为retain
)在另一个类的生命中,指定@property的内存管理参数为release
三、autorelease
1> 基本使用
作用
① 将调用该方法的对象放进自动释放池,当池子销毁时,对池子内所有
的对象执行一次release操作
② 通常在对象创建时调用,放回对象本身自动释放池的创建方式
① 通过@autoreleasepool{}创建
② 通过NSAutoreleasePool类创建
2> 使用注意
- 自动释放池的创建和释放遵循栈规则
- 调用autorelease方法不会对引用计数器产生影响
- autorelease方法延迟了对象的释放时间,占用内存较大的对象不要使用
- 一个对象不能多次调用autorelease方法
- 一个对象不能同时使用autorelease方法和release方法
3> 常见应用
快速创建一个自动释放池内的对象
① 通常设计一个类方法,快速创建一个自动释放池内的对象
② 方法名通常以类名开头
③ 创建时要使用self调用alloc、init与autorelease方法,不要使用类名
四、ARC
1> 基本使用
强指针与弱指针
① 强指针
1)通过__strong声明的指针
2)所有的指针默认都是强指针
② 弱指针
1)通过__weak声明的指针
2)当弱指针指向的对象被释放,弱指针将被清空判断准则
只要没有强指针指向对象,对象就会被释放
2> @property的strong和weak参数
- strong参数相当于retain参数
- weak参数相当于assign参数
OC - 5.内存管理的更多相关文章
- 12.Object-C--浅谈OC的内存管理机制
昨天学习了OC的内存管理机制,今天想总结一下,所以接下来我要在这里bibi一下:OC的内存管理. 首先我要说的是,内存管理的作用范围. 内存管理的作用范围: 任何继承了NSObject的对象,对其他基 ...
- 黑马程序员——OC的内存管理学习小结
内存管理在Objective-C中的重要性就像指针在C语言中的重要程序一样. 虽然作为一门高级语言,但OC却没有内存回收机制.这就需要开发者来对动态内存进行管理.OC中内存管理的范围是:任何继承了NS ...
- OC:内存管理、dealloc方法、copy知识点
属性的声明:使⽤@property声明属性 例如:@property NSString *name: 相当于@interface中声明了两个⽅法(setter.getter): 属性的实现:使⽤@s ...
- OC的内存管理机制
总的来说OC有三种内存管理机制,下面将分别对这三种机制做简要的概述. 1.手动引用计数(Mannul Reference Counting-MRC) mannul:用手的,手工的. 引用计数:reta ...
- OC基础 内存管理
OC基础 内存管理 我们所了解的c语言内存管理,如下: (1)c语言的内存分配:char *p = (char*)malloc(100*sizeof(char)); (2)c语言的内存释放:free ...
- OC的内存管理(一)
在OC中当一个APP使用的内存超过20M,则系统会向该APP发送 Memory Warning消息,收到此消息后,需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等,否则程序会 ...
- 黑马程序员——OC语言 内存管理
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)计数器 每个对象内部都保存了一个与之相关联的整数,称为引用计数器,当 ...
- OC的内存管理
摘自:http://blog.csdn.net/hahahacff/article/details/39839571 OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有 ...
- oc语言--内存管理
一.基本原理 1.什么是内存管理 1> 移动设备的内存及其有限,每个app所能占用的内存是有限制的 2> 当app所占用的内存较多时,系统就会发出内存警告,这是需要回收一些不需要的内存空间 ...
随机推荐
- å∫ç∂´ƒ©˙ˆ∆˚¬µ˜øπœ®ß†¨√∑≈¥Ω who know?
´é∑w∑w∑wqq¡œœ∑åååß∂˚¬∆¬˚∆˙ß∂ƒµ˜∫√ç≍Ωåœ∑´®†¥¨ˆøπ“‘æ…¬˚∆˙©ƒ∂ßåΩ≍ç≍ç√∫˜µ≤≥÷÷¡™£¢∞§§¶••ªº–≠«``¡™£¢∞§¶•ªº ...
- 动态代理入门(jdk)
动态代理就是aop的核心,动态代理简单的就是通过创建一个代理对象,然后把原来的方法增强.很抽象,例子是王道.jdk中提供了动态代理的实现,但是它是针对接口,如果要实现动态代理,需要被代理对象的接口.这 ...
- JDK1.5新特性(三)……Varargs
援引 Varargs - This facility eliminates the need for manually boxing up argument lists into an array w ...
- vijosP1049 送给圣诞夜的礼品
vijosP1049 送给圣诞夜的礼品 链接:https://vijos.org/p/1049 [思路] 快速幂+矩阵转换. 将m次矩阵的转换看作是一次快速幂中的乘法操作,这样可以用O(log(k/m ...
- nginx + lua 构建网站防护waf(一)
最近在帮朋友维护一个站点.这个站点是一个Php网站.坑爹的是用IIS做代理.出了无数问题之后忍无可忍,于是要我帮他切换到nginx上面,前期被不断的扫描和CC.最后找到了waf这样一个解决方案缓解一下 ...
- Ⅵ.spring的点点滴滴--自定义类型转换器
承接上文 自定义类型转换器 .net篇(环境为vs2012+Spring.Core.dll v1.31) public class CustomeConverter : TypeConverter{ ...
- SVN eclipse插件错误
部分文章转载自:http://www.bkjia.com/ASPjc/1015687.html 出现如下问题该怎么做: 1.在Windows--Preferences--Team--SVN--接口换成 ...
- tomcat热部署,更改java类不用重新加载context
修改类后,tomcat热部署会重新加载整个项目的context,影响开发效率.网上查的大多数是将server的modules标签中Auto Reload项改为Disabled,但是没有效果. 使用以下 ...
- PowerShell运行cmd命令
1.使用.exe扩展名 2.使用 cmd /c "" 3.在 PowerShell v3 中有另一种选择来解决这个问题,只需在命令行的任意位置添加 –% 序列(两个短划线和一个百分 ...
- Android(java)学习笔记155:如何让你的GridView不再滚动
GridView显示不完整的原因是因为,他的外层也套用了一个滑动的控件,这个解决办法是:重写GridView,是控制GridView不能滚动,就是写一个类继承GridView 代码如下: publ ...