iOS 构造方法
构造方法:用于在对象创建出来的时候为对象的成员变量或者属性赋值
1.构造方法就是初始化对象的方法,它属于对象方法。构造方法分为系统自带和自定义构造方法。
如何创建自定义构造方法:
- 属于对象方法那么以 - 号开头
- 返回值一般为id类型
- 方法名一般以init开头
2.实现方式
(1)如果是系统自带的构造方法,需要重写父类中自带的构造方法 比如init
(2)如果是自定义构造方法,需要自己去实现 init:
注意:无论是哪种形式的构造方法,在实现构造方法的时候都需要先调用父类的构造方法 。构造方法在执行的时候先调用父类的方法,再执行子类的方法,如果 有多个继承会一层一层的向上找父类方法,将父类方法执行完后再一层层的执行子类的构造方法
/*********************** Person.h文件 **************************************/ #import <Foundation/Foundation.h> @interface Person : NSObject // @property 默认生成的成员变量为@private类型子类无法直接访问 可以通过get/set方法访问
// 年龄 @property int age;
// 姓名 @property NSString *name;
// 自定义构造方法 在初始化的时候为属性"年龄"和"姓名"赋值 - (id)initWithAge:(int)age andName:(NSString *)name; @end
/*********************** Person.m文件 **************************************/ #import "Person.h" @implementation Person // 重写父类的init方法 父类init方法返回的是id类型就是为了让任何子类的对象调用 - (id)init { // 1.首先初始化父类NSObject中声明的一些成员变量和属性 然后将初始化的对象赋值给当前对象 self = [super init]; // 2.如果父类的初始化成功 再初始化子类对象 if (self!= nil) { // self是个指针 如果为空意味着指向0 也可以这样写 self != 0 _age = 10; } // 3.返回已经初始化完毕的对象 return self; }
// 实现自定义构造函数 在初始化的时候为属性赋值 - (id)initWithAge:(int)age andName:(NSString *)name { if (self = [super init]) { _age = age; _name = name; } return self; } @end
/*********************** Student.h文件 **************************************/ #import <Foundation/Foundation.h> #import "Person.h" @interface Student : Person // 学号 @property int stuNo; // 姓名 @property NSString *name; // 自定义构造方法为子类Student的属性stuNo、age、name赋值 - (id)initWithName:(NSString *)name andAge:(int)age andStuNo:(int)stuNo; @end
/*********************** Student.m文件 **************************************/ #import "Student.h" @implementation Student // 将学生的学号默认为1 重写父类的构造方法 - (id)init { if (self = [super init]) { _stuNo = 1; }
return self; } // 实现自定义的构造方法 初始化子类中所有的属性 name属性和age属性继承自父类Person类 - (id)initWithName:(NSString *)name andAge:(int)age andStuNo:(int)stuNo { // 直接调用父类Person的构造方法 将age和name直接交给父类 让父类去初始化 if (self = [super initWithAge:age andName:name]) { // 体会这种思想 _stuNo = stuNo; } return self; } /** * 在初始化的时候在子类中将子类对象的属性以及继承父类中的所有的属性都初始化了 不建议这么写 * - (id)initWithName:(NSString *)name andAge:(int)age andStuNo:(int)stuNo { // 调用NSObject中的方法 if (self = [super init]) { self.age = age; // [self setAge:age] 子类通过get/set调用父类的属性 self.name = name; _stuNo = stuNo; } return self; } */ @end
/*********************** main.m文件 **************************************/ #import <Foundation/Foundation.h> #import "Person.h" #import "Student.h" int main(int argc, const char * argv[]) { Person *person = [Person new]; NSLog(@"%d",person.age); // 执行完init方法后,任何成员变量都默认为0 Person *p = [[Person alloc] init]; NSLog(@"%d",p.age); Person *p1 = [[Person alloc] initWithAge:10 andName:@"Rose"]; Student *stu = [[Student alloc] initWithName:@"Jack" andAge:22 andStuNo:1000]; return 0; }