黑马程序员技术交流社区
标题: 学习笔记15-OC内存管理(二) [打印本页]
作者: 仰望星空的猪 时间: 2015-11-27 10:50
标题: 学习笔记15-OC内存管理(二)
@import “学习笔记14-内存管理(一)”
8 @property参数
格式 @property (参数1,参数2) 数据类型 方法名
| 参数类别 | | |
| | |
| |
| | |
| |
| | |
| 适用对象 先release旧值 后retain新值 |
| |
注意
创建的成员变量为对象类型时 必须重写dealloc方法 释放对象类型。
set和get方法的名称
修改BOOL类型变量的set和get名称
例 BOOL vip;
在@property (nonatomic,assign,setter = isVip) BOOL vip;
本来生成的方法名为 setVip 修改之后之后为 isVip。
9 @class的使用
使用方式
@class 类名
含义是:告诉编译器 这是一个类,至于类中有哪些属性和方法,此处不去检测。
好处:引入类 发生了改变 不需要重新编译。
坏处:只是告诉编译器有哪些属性,没有哪些方法 需要在.m文件导入头文件。
编译器编译的时候只编译头文件,在运行的时候才重新编译.m文件。
可以解决循环引用的问题。
A引用B B 引用A 使用#import会报错使用@class 不会
10 循环retain
栈区的指针释放之后 两个对象还在互相指向对方 谁都无法释放。
解决方法:其中一个对象多 release 一次。
一个变量声明的时候用retain 一个用assign
11 自动释放池
特殊的栈结构
特点:对象可以加入自动释放池中,自动释放池结束的时候会给池中的对象发送一条release消息。
好处:不需要关心对象释放的时间 不需要关系什么时候释放对象
1) 创建自动释放池
@autoreleasepool{
[对象 autorelease];//将对象加入自动释放池
}
注意
1) 对象只有加入到自动释放池,才会有自动释放的效果
2) 只能在自动释放池的代码内加入
3) 对象的生成可以在释放池之前或者释放池内
4) 多次调用 autorelease 会登记多次 释放的时候也会释放release多次。
5) 由于栈结构的特点,释放池中不适合放空间太大的对象
6) 释放延迟了对象的生命周期
快速创建对象
在类用创建类方法 在类方法中完成创建对象并且将对象加入到释放池
例 在Person类中加入快速创建对方法(类方法)
+ (insanetype) person{
//创建对象返回 并且将对象加入到释放池
return [ [ [self alloc] init ] release]; //子类也可以调用此方法
}
12 ARC
特性:对 retain release和autorelease say goodbye
原理:编译器会自动在合适的位置加入 retain release和autorelease。
指针的分类
强指针:默认都是强指针 关键字 strong
弱指针:
判断准则
对象只要没有强指针指向 就会被释放,如果只有弱指针指向会将指针指向nil。
多个对象内存管理
可以在定义变量时候 参数中加入对象指针修饰符(strong weak)而不能使用retain。
ARC下解决循环引用的问题
将一个类对象设置为强指针,另一个设置为弱指针。
ARC下@property参数
strong相当于MRC 中的 retain weak相当于 MRC中assign。assign不变。
注意
1) 不容许使用retain release和autorelease
2) 可以重写dealloc 但是不能调用 [super dealloc]
3) @property的转变。
ARC模式下兼容非ARC的类
将编译的源文件 设置为 -foo-objc-arc
MRC转换ARC
Xcdoe edit-Refactor- convert to OC ARC
| 欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |