oc构造函数
//new方法做了如下两件事,一般开发比较少用new,因为分配空间不能选择其他方式初始化 Person *p = [Person new]; //1、调用+alloc分配存储空间 Person *p1 = [Person alloc]; //2、调用-init进行初始化 Person p2 = [p1 init]; //Person *p3 = [[Person alloc] init];合起来写
构造方法用来初始化对象的方法,因此init方法为构造方法。初始化后成员变量值为0。
//重写-init方法,可以对成员变量赋值,因为子类返回类型不确定(多态),因此写id类型,id相当于NSObject *万能指针 -(id)init { //一定要先调用super的init方法,初始化父类的成员变量,如isa(指向该对象的类)和属性 //[super init];当前对象self if(self=[super init])//先赋值给self,若self不为空执行下面的 { //初始化成功do something...进行子类内部成员变量初始化 } return self; }
自定义构造方法
1、一定是对象方法,以-开头
2、返回值一般是id类型
3、方法名一般以init开头
4、父类的属性调用父类方法去处理,如[super initwithxxx],子类处理自己的
-(id)initWithName:(NSString *)name andAge:(int)age { if(self=[super init]) { _name = name; _age = age; } return self; }
析构函数
在对象计数器减为o时,自动调用dealloc
-(void)dealloc { do something... [super dealloc];//一定要在最后调用dealloc }
oc类的本质
类创建的对象为实例对象,实际上类本身也是一个对象,是个class类型的对象,简称类对象。
typedef struct objc_class *Class;
Person *p1 = [[Person alloc] init]; Person *p2 = [[Person alloc] init]; //获取内存中的类对象 Class c1 = [p1 class]; Class c2 = [p2 class]; [c1 test];//调用类的类方法,相当于[Person test] //或者 Class c3 = [Person class]; //利用class创建Person类对象 //利用Person类对象创建Person类型的对象
类对象==类名(c3==Person),一个类只有一个类对象
类的加载和初始化
1、类在程序启动时,就会加载一次项目中的所有类及分类,且只会加载一次。先加载父类再加载子类。类加载会调用类和分类+load。
+(void)load
{
}
2、当第一次使用这个类的时候,会调用当前类的+initialize方法。先初始化父类再初始化子类。可以监听类在什么时候被使用。
+(void)initialize
{
}