- <李>
<强>对象的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 自我 }
初始化方法是一层一层往下调用的
,,,,,重写构造方法的目的是为了对象创建出来,成员变量就会有一些规定的值
,,,
- <李>
<>强自定义初始化方法强>
李>默认的初始化方法不带参数,只能为对象初始化一些固定值
通过自定义初始化方法可以实现通过参数初始化对象属性。
,,,,,返回值一般是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指针指向就是类对象
,,,
方法的调用过程:
,,,实际上就是通过基类部分的isa属性,找到成员函数列表,再将消息传递的参数拿过来和函数列表中的参数对比。在自己的函数列表中找不到就到父类的函数列表中去找,直到找到为止。