objective - c(6)对象的构造

   <李>

<强>对象的alloc + init

类对象的新的方法可以创建一个属性均为0的对象

新方法实际上是两个方法的连续调用:

,,,1)分配存储空间alloc类对象方法

,,,2)初始化init对象方法

也就是说人* p=(新)人;等同于:人* p=[[人alloc] init];


分配和初始化方法都是NSObject的方法,故所有的OC类型都可以使用这种方式创建对象

初始化方法:

安康;(instancetype) init

,,,,,该方法的默认操作:调用父类的初始化方法,并返回对象本身,成员变量的初值为0


<李>

<强>重写初始化方法

默认的初始化方法,将对象的属性初值设为0,如果我们想要指定一个初值,就需要重写该方法。

NSObject的子类重写初始化方法的步骤:

,,,, 1。调用父类的初始化方法,将其父类中的属性初始化

,,, 2。为子类的属性初始化

,,, 3。返回对象本身

重写初始化方法一般形式:

如:人类,包含一个属性_age

安康;(instancetype),初始化   {   ,,,if  (, self =, (super  init),), {   ,,,,,,,_age =, 10;   ,,,}   ,,,return 自我;   }

再如:人的子类学生,包含一个属性得分

安康;(instancetype), init   {   ,,,if  (, self =, (super  init),),{//调用了父类人的init函数   ,,,,,,,_score =,, 1;   ,,,}   ,,,return 自我   }

初始化方法是一层一层往下调用的

,,,,,重写构造方法的目的是为了对象创建出来,成员变量就会有一些规定的值

,,, objective - c(6)对象的构造


<李>

<>强自定义初始化方法

默认的初始化方法不带参数,只能为对象初始化一些固定值

通过自定义初始化方法可以实现通过参数初始化对象属性。

,,,,,返回值一般是instancetype类型

,,,,,方法名以initWith开头

如人类中包含属性姓名和年龄

安康;(instancetype), initWithName: (NSString  *), name  {   ,,,if  (, self =, (super  init),), {   ,,,,,,,_name =,名称;   ,,,}   ,,,return 自我;   }   安康;(instancetype), initWithName:(NSString *) name 年龄:(int), age  {   ,,,if  (, self =, (super  init),), {   ,,,,,,,_name =,名称;   ,,,,,,,_age =,年龄;   ,,,}   }

子类的初始化方法应指定调用父类的哪个初始化方法

如人子类学生类:

安康;(instancetype), initWithName: (NSString  *) name 年龄:(int), age 分数:(int), score , {   ,,,if  (=, self  [super  initWithName: name 年龄:年龄),),{   ,,,,,,,//也可以用超级的初始化方法及集方法,但不推荐   ,,,,,,,_score =,分数;   ,,,}   ,,,return 自我;   }

有时我们需要创建一个现有对象的副本,则应编写一个拷贝构造方法,参数为对象指针

安康;(instancetype), initWithPerson:人(*),p   {   ,,,if , (, self =, (super  init),), {   ,,,,,,,_age =, p.a ge;   ,,,,,,,_name =, p.name;   ,,,}   ,,,return 自我;   }

一个对象销毁时,会调用一个dealloc方法

,,,

,,,,,该方法在最后应调用父类的dealloc方法

,,,,, dealloc方法不能直接调用

,,,,,需要注意的是,在引入弧机制后,重写这个方法时不能调用父类被重写的dealloc方法



<李>

<强>类对象

我们定义的类也是一种对象,是类类的对象

类创建人类对象,再通过人类对象方法来创建对象。

,,,,,这里:类对象==类

之前说过,每个对象都一个isa指针,isa指针指向就是类对象

,,, objective - c(6)对象的构造

方法的调用过程:

,,,实际上就是通过基类部分的isa属性,找到成员函数列表,再将消息传递的参数拿过来和函数列表中的参数对比。在自己的函数列表中找不到就到父类的函数列表中去找,直到找到为止。


objective - c(6)对象的构造