ARC(automatic reference counting)机制
判断是否是ARC机制
- ARC机制中不能使用retain release autorelease retainCount
- 在dealloc方法中不能使用 [super dealloc];
在ARC下对象释放的判断依据: 对象没有强指针指向
指针默认的都是强指针,比如我们创建的对象都是默认的强指针
Person *p1 = [[Person alloc] init];
__strong 修饰符,修饰这个指针是一个强指针,也可以不写
__weak 修饰的这个指针是弱指针
ARC下的循环引用问题
当两个对象互相拥有的时候,如果定义的时候都用strong,那么就会导致循环引用的问题,双方互相强指针指向,不能被释放
解决这个问题的方法是:将其中一个以weak定义,就能完美解决这个问题了
ARC下set方法内存@property参数
ARC中的@property
strong:用于OC对象,相当于MRC中的retain
weak:用于OC对象,相当于MRC中的assign(代理一般用weak,UI控件一般用weak)
assign:用于基本数据类型,跟MRC中的assign一样
copy:一般用于NSString,跟MRC中的copy一样
ARC注意:
__weak Person *p=[[Person alloc] init]; // 不合理,对象一创建出来就被释放掉,对象释 放掉后,ARC把指针设置为nil。
如何让ARC的项目兼容非ARC的类
让程序兼容ARC和非ARC部分
- 转变为非ARC -fno-objc-arc
- 转变为ARC的, -f-objc-arc
在哪里添加编译器标示 -fno-objc-arc如下图
将MRC转化为ARC(不建议这么使用,若要尝试做好备份)
分类(Category)
分类的使用注意事项:
--------->在分类的声明中不能声明实例变量
--------->不能定义实例变量 也不能使用 @property
--------->在分类的方法中,可以访问类中的实例变量
--------->在分类中存在和类同名的方法 优先访问的时 分类中 的方法
当在多个类别中有同名的方法的时候,这时候,执行的最后编译的那个类别的同名方法
分类的 > 原类
最后编译的分类 > 其他的分类
分类(Category)非正式协议
非正式协议就是给NSObject类或Foundation框架中的子类创建的类目(分类),即给它们添加方法,叫做非正式协议
类的延展的概念
延展类别又称为扩展(Extendsion)
Extension是Category的一个特例 其名字为匿名(为空),并且新添加的方法一定要予以实现。(Category没有这个限制)
// 这个一般用在.m文件中,作为私有的方法和成员变量 @interface Student () { // 可以添加成员变量 } // 添加方法 @end