021-ARC与分类-OC笔记

学习目标

1.【掌握】自动释放池

2.【理解】ARC机制

3.【理解】单个对象的内存管理

4.【理解】多个对象的内存管理

5.【掌握】ARC机制下的循环引用问题

6.【了解】MRC和ARC的兼容

7.【了解】MRC自动转为ARC

8.【掌握】分类Category

一、自动释放池

使用@autoreleasepool关键字声明一个代码块,这个代码块中的对象调用autorelease方法后,在自动释放池被销毁的时候,会统一调用一次这些对象的release方法(注意只是调用对象的release方法,并不是直接释放对象)。这样一来就起到了自动释放的作用,不过同时对象的销毁过程也得到了延迟。

应用场景一:创建对象后,我们无需再手动调用一次对象的release方法。

总结:

1.autorelease方法不会改变对象的引用计数器,只是将这个对象放到自动释放池中。

2.自动释放池实质是当自动释放池销毁后统一调用一次对象的release方法,不一定就能销毁对象(如果一个对象的引用计数器大于1就无法销毁)。

3.由于自动释放池最后统一销毁对象,因此如果一个操作比较占用内存(对象比较多或者对象占用资源比较多),最好不要放到自动释放池或者考虑放到多个自动释放池。

应用场景二:类方法快速创建一个本类对象

总结:

1.创建对象的类方法的方法名要遵守规范,以首字母小写的类名开头,如果没有参数就直接是类名,如果有参数就是类名WithXXX:。

2.在类方法实现中创建对象同时并调用autorelease方法,这样调用者就不需要手动释放。

3.OC类库中的类方法一般都不需要手动释放,内部已经调用了autorelease方法。

二、ARC机制

在OC中也有一种内存自动管理的机制叫做ARC(Automatic Reference Counting)自动引用计数,与C#、Java不同的是,这只是一种半自动的机制,有些操作还是需要我们手动设置的。要特别注意的是在ARC机制下不允许写retain、release、autorelease,并且在重写dealloc方法中不允许调用父类的dealloc方法,在编译器编译代码的时候会自动在需要的地方自动加上。

ARC机制以指向对象的指针强弱类型作为回收对象的基准,当没有任何强指针指向对象的时候对象就会被释放。创建一个对象默认就是强指针类型,当然我们也可以使用__strong和__weak(是两个下划线额)来显示的声明强指针和弱指针。

声明强类型的指针指向对象,再将强指针赋值nil

声明强类型的指针指向对象,再将弱类型的指针也指向对象,最后强指针赋值nil

直接声明弱类型的指针指向对象,对象会见光死

三、单个对象的内存管理

我们知道当指向对象的所有强类型指针被回收的时候,对象也会立即被回收。同理,当所有指向对象的指针被赋值为nil的时候,对象也会被立即回收,并且还会为指向对象的弱指针的值自动赋值为nil。

四、多个对象的内存管理

在ARC机制下,如果一个类的属性是另外一个类的类型的时候,这个属性一定是强指针。

注意:

1.在ARC机制下,@property参数retain就无法使用了,因为retian参数代表的意义是生成的set方法是标准的MRC下的内存管理代码。而ARC下,不需要引用记数,就不需要生成这些内存管理代码了。

2.在ARC机制下,属性的类型的OC对象类型的时候,一般使用strong,非OC对象的类型使用assign

3.strong、weak都是针对OC对象类型的属性,非OC对象不能使用strong、weak。

五、ARC机制下的循环引用问题

在ARC机制下,当两个类相互引用作为对方的属性的时候,如果两边的@property都使用strong就会出现循环引用而导致内存泄露。解决办法是一端使用strong,一端使用weak。

六、MRC和ARC的兼容

如果在ARC模式的程序中,有一些类是使用MRC模式开发的(网上下载大神写的类是使用MRC写的),我们不想修改源文件让MRC和ARC能兼容,可以单独为MRC模式中开发的类设置不使用ARC机制。

021-ARC与分类-OC笔记

七、MRC自动转为ARC

MRC模式的程序是可以直接自动转换为ARC模式的,不过转换的方式是删除所有的retain、relase、autorease、[super dealloc],将retain替换为strong。这样就会发生很多未知错误,所以请谨慎。

021-ARC与分类-OC笔记

八、分类Category

当我们不改变原有代码为一个类扩展其他功能时我们可以考虑继承这个类进行实现,但是这样一来使用时就必须定义成新实现的子类才能拥有扩展的新功能。如何在不改变原有类的情况下扩展新功能又可以在使用时不必定义新类型呢?Apple提供了一种语法,在OC中使用分类Category可以对一个类进行分模块管理或扩充功能

021-ARC与分类-OC笔记

021-ARC与分类-OC笔记

021-ARC与分类-OC笔记

Category基本用法

注意:

1.在分类里只能增加方法,不能增加成员变量

2.在分类里可以写@property,但不会生成私有属性,所以在分类中不要使用@property

3.在分类的方法实现中不可以直接访问本类的私有属性,需要通过(点语法)setter、getter方法访问

4.当分类中有本类中同名的方法,会优先访问分类中的方法

5.如果多个分类中有同名的方法,会优先访问最后编译的分类中的方法(编译顺序可在Xcode中设置,都知道就懒得上图了)。

6.为NSObject类或者其子类添加分类,就叫做非正式协议

六阿哥

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: