@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
|