初始化器用于初始化对象实例或者类型,是一个特殊的函数
对象初始化器:-(id) init 可以重载多个 返回值是id
类型初始化器:+(void)initialize 只能有一个 返回值void
析构器用于释放对象拥有的资源,无返回值的函数
对象析构器 -(void)dealloc 只能有一个 无参数
没有类型析构器
对象初始化器
初始化对象实例时,init通常和alloc搭配使用。
alloc所做的事情-NSObject已实现 类方法返回一个指针
*在堆上分配合适的大小内存
*将属性或者实例变量的内存置0
init所做的事情-可以自定义:
*调用父类初始化器【super init】前置条件(必写) 有返回值id
-(id)init
{
//1.先调用父类的初始化方法
self = [super init];
//2.判断是否为空
if(self){
//3.初始化实例变量
self.name//在初始化内部不要使用属性
_name = [name copy];
}
return self;
}
*初始化当前对象实例变量 (注意使用实例变量,不要使用属性)
new相当于调用alloc/init的无参数版本
Book *b2 = [Book new];//先alloc 再init 区别是new不能传参数
Book *b2 = [Book alloc] initwithName:@"wu"];//可以传参数
类初始化器
类初始化器initialize负责类型级别的初始化
+(void)initialize
{
//self 就是当前类的类型表示
if(self == [Book class])
{
}
}
initialize在每个类使用之前被系统自动调用,且每个进程周期中,只能被调用一次。
子类的initialize会自动调用父类的initialize 前置调用
对象析构器
对象析构器dealloc负责释放对象拥有的动态资源:
自动实现:1.ARC将对象属性引用计数减持
手动实现:2.释放不受ARC管理的动态内存,如malloc分配的内存
手动实现:3.关闭非内存资源,如文件句柄 网络端口
-(void)dealloc
{
// 1.自动调用:ARC将对象属性引用计数减持
//2.手动调用:手动释放 关闭非内存资源,如文件句柄 网络端口
NSLog(@"Book is release")
//3.自动调用:父类的dealloc
}
dealloc由ARC根据对象的引用计数规则,在释放对象内存前自动调用,无法手工调用。
子类的dealloc会自动调用父类的dealloc (后置调用)