OC核心语法(2)构造函数

来源:互联网 发布:做淘宝店铺用什么软件 编辑:程序博客网 时间:2024/04/18 16:37

一、构造方法概念及举例

    用来初始化对象的方法,是个对象方法,- 开头,init 就是构造方法。

例如; Person *p=[Person new];

New方法的内部会分别调用两个方法来完成2件事情,1)使用alloc方法来分配存储空间(返回分配的对象);2)使用init方法来对对象进行初始化。

可以把new方法拆开如下:

1>调用类方法+alloc分配存储空间,返回未经初始化的对象

Person *p1=[person  alloc];

2>调用对象方法-init进行初始化,返回对象本身

Person *p2=[p1 init];

3>以上两个过程整合为一句:

Person *p=[[Person alloc] init];

二、重写init方法

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

重写构造方法的注意点:

1>先调用父类的构造方法([super init])

2>再进行子类内部成员变量的初始化

    代码实例:

1>需求:新建的Person对象年龄为20

#import <Foundation/Foundation.h>// Person类的声明@interface Person : NSObject@property age;@end// Person类的实现@implementation Person// 重写init方法- (id)init{    // 如果对象不为空,即进行初始化成功,那再进行赋值    if(self = [super init]){        _age = 20;    }    // 返回对象本身    return self;}@endint main(){    Person *p = [[Person alloc] init];    // 新建的对象p的_age属性被初始化为20    NSLog(@"age is %i", p.age);    return 0;}

2>需求变更:Student继承Person,新建的Student对象年龄是20,学号是2014

#import <Foundation/Foundation.h>// Person类的声明@interface Person : NSObject@property int age;@end// Person类的实现@implementation Person// 重写init方法- (id)init{    // 如果对象不为空,即进行初始化成功,那再进行赋值    if(self = [super init]){        _age = 20;    }    // 返回对象本身    return self;}@end// Student类的声明@interface Student : Person// 学号属性@property int id;@end// Student类的实现@implementation Student- (id)init {    if(self = [super init])        _no = 2014;    return self; // 返回初始化并赋值完毕的Student的对象}@end// 主函数int main() {    Student *s = [[Student alloc] init];    NSLog(@"age is %i, id is %i", s.age, s.id);    return 0;}

3>程序运行原理示意图


4>步骤详解

Person *p = [[Person alloc] init];

Student *s = [[Student alloc] init];

第一句,给Person分配内存空间后,执行init方法,本类中有该方法优先调用本类中该方法,Person中init方法第一句if括号内调用父类(即NSObject)中的init方法,继而执行NSObject中init方法,把isa赋值为当前类[Person Class],即isa初始化完毕。接下来返回到Person的init方法中继续进行if大括号内的语句,将_age初始化为10。Person初始化完毕。

第二句,也是类似由Student类中init方法第一句执行去调用父类Person的init方法,Person的init方法第一句执行去调用NSObject中init方法,把isa赋值为当前类[Student Class],即isa初始化完毕。Person中init方法继续执行,将_age赋值初始化为10。返回到Student中init方法,再将 _no赋值初始化为1 。Student对象创建并初始化完毕。

三、自定义构造方法

    1.规范:

1>一定是对象方法,一定以 - 开头。(调用某个对象方法进行初始化)

2>返回值一定是id类型

3>方法名一般是以init开头。

4>成员变量数量:自有成员变量加父类成员变量。(NSObject默认有成员变量ISA)

    2.代码实现范例

// 设置age的初始化方法- (id)initWithAge:(int)age{    // 是否初始化成功    if (self = [super init]) {        _age = age;    }    return self;}int main() {    // 如果初始化 成功,则age默认为29;    Person *p = [[Person alloc ] initWithAge:29]; }

    3.原则:父类的成员变量父类处理,子类的成员变量子类处理。

0 0