1.使用注意
1)并不是所有放到释放池中的代码,产生的对象就会自动释放。如果需要释放,必须加入到自动释放池。 Person *p = [[Person new] autorelease];
2)如果对象调用了autorelease,但是没有在任意一个自动释放池中,此时该对象也不会被加入到自动释放池中。
3)
我们只需要在自动释放池代码块中调用autorelease, 就可以把对象
加入到自动释放池
2. 自动释放池中不适合放占用内存比较大的对象。
3. instancetype 可以智能帮我们判断赋值赋值的指针变量的类型和方法的返回值类型是否一致
二、ARC
1. 指针分类:
强指针:默认情况下,所有的指针都是强指针,关键字strong
弱指针:_ _weak关键字修饰的指针
2. ARC判断准则:
只要没有强指针指向对象,对象就会被释放
3. 特点:
1)判断是否是ARC机制
2) 查看项目信息 不能使用retain release autorelease retainCount,
在dealloc方法中不能使用 [super dealloc];
3)
正常创建对象,不用手动释放对象
4.
__strong 修饰符,修饰这个指针是一个强指针,也可以不写
__weak 修饰的这个指针是弱指针
5.
在ARC下 @property set方法参数
原子性\读写 和MRC下是一样的
MRC ARC
assign assign
retain strong(强指针)OC其他的对象 weak(弱指针) UI控件
copy copy
6. 多对象的循环引用,在ARC下的解决办法是:在一段使用强指针,一段使用弱指针
7. ARC中,只要弱指针指向的对象不存在了,那么该对象就会被销毁,弱指针指向nil
8. ARC模式下兼容MRC
转换为非ARC -fno-objc-arc 转换为ARC:-f-objc-arc
9.
MRC
转换为
ARC
三、分类(Category)
1. 作用:
1)在不修改原有类的基础上增加新的方法
2)一个庞大的类可以分模块开发
3)一个庞大的类可以由多个人来编写,更有利于团队合作
2. 使用分类的步骤
先声明分类 实现分类 使用分类
3. 分类文件的命名:
@interface 待扩展的类名 (分类的名称)
@end
@implementation 待扩展的类 (分类的名称)
@end
4. 注意事项:
1) 在分类的声明中不能声明实例变量,
不能定义实例变量也不能使用 @property
2) 在分类的方法中,可以访问类中的实例变量
3) 在分类中存在和类同名的方法,
优先访问的是分类中的方法
4) 当在多个类别中有同名的方法的时候,这时候执行的最后编译的那个类别的同名方法
分类 > 原类
最后编译的分类 > 其他的分类
5. 非正式协议就是类别,即:凡是NSObject或其子类的类别,都是非正式协议。
6.
扩展\延展\延展分类:
延展是一个特殊的分类
特点:
1)可以在延展中 定义实例变量
2) 不能使用 @implementation 类名() 实现类别的方法
3) 可以定义私有的变量和方法