`
MagicBird
  • 浏览: 137299 次
  • 性别: Icon_minigender_2
  • 来自: 惠州
社区版块
存档分类
最新评论

Day9 oc构造函数、析构函数及类本质

    博客分类:
  • ios
阅读更多

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

{

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics