OC-分类与释放池

来源:互联网 发布:mysql清空表数据 编辑:程序博客网 时间:2024/05/22 21:46

分类

1) 分类,在不改变原来模型的情况下,可以给某个类扩充一些方法
2) 分类只能增加方法,不能增加成员变量
3)分类方法实现中可以访问原来类中声明的成员变量
4)分类的优先级最高,方法优先去分类中去找,再去原来类中去找,最后再去父类中找
5)分类可以重写原来类中的方法,但是会覆盖掉,会导致原来的方法失效,没法再使用
6)方法调用的优先级:分类(最后参与编译的分类优先) –> 原来类 –> 父类
7)分类的应用一般是扩展系统的类的方法,比如扩展NSString类的方法

主要解决的问题是:在一个类中方法太多,所以通过将方法模块化以后可以解决方法集中在一个文件中产生的凌乱的问题。

分析:OC中分类这个概念有点像Java的抽象概念,但是又不完全一样,因为分类是在原有接口(interface)中将相关的方法归门别类,这样做的好处有几点:
1)方便程序员理解程序框架、查看和了解方法所处在的位置
2)便于扩展现有类的方法,不需要访问类的源代码,也无需创建子类
3)和一般的接口不同,不必实现分类中的所有方法

分类的注意点:
1、不能定义自身的任何变量
代码演示:

这里写图片描述

释放池

什么是自动释放池

1、Autorelease pool   

自动释放池(Autorelease pool)是OC的一种内存自动回收机制,可以将一些临时变量通过自动释放池来回收统一释放。自动释放池本身销毁的时候,池子里面所有的对象都会做一次release操作   

2、autorelease   

任何OC对象只要调用autorelease方法,就会把该对象放到离自己最近的自动释放池中(栈顶的释放池)。

创建一个自动释放池
@autoreleasepool { }

自动释放池的销毁时间
当我们将一个对象发送了autorelease消息时,当自动释放池销毁时,会对池中的每一个对象发送一 条release消息,以此来进行释放它们。

自动释放池的数据结构 :
自动释放池是以栈的形式实现,当你创建一个新的自动释放池,它将会被添加到栈顶。接受autorelease
消息的对象将会被放入栈顶

如何持有对象 :
当我们使用alloc,copy,对象获取一个对象时,我们需要负责显示的安排对象的销毁,其他方法获取的对
象将交给自动释放池进行释放(单例模式除外)

0 0
原创粉丝点击