07-08、构造方法基本概念:重写init方法

2017-09-21  本文已影响0人  山中石头

在OC中init开头的方法, 我们称之为构造方法
构造方法的用途: 用于初始化一个对象, 让某个对象一创建出来就拥有某些属性和值

重写init方法, 在init方法中初始化成员变量
注意: 重写init方法必须按照苹果规定的格式重写, 如果不按照规定会引发一些未知的错误
1.必须先初始化父类, 再初始化子类
2.必须判断父类是否初始化成功, 只有父类初始化成功才能继续初始化子类
3.返回当前对象的地址

#import "Person.h"

@implementation Person

/*
第一种写法:
- (instancetype)init
{
// 1.初始化父类
// 只要父类初始化成功 , 就会返回对应的地址, 如果初始化失败, 就会返回nil
// nil == 0 == 假 == 没有初始化成功
self = [super init];
// 2.判断父类是否初始化成功
if (self != nil) {
    // 3.初始化子类
    // 设置属性的值
    _age = 6;
    
}
// 4.返回地址
return self;
}
 */

/*
第二种写法:
- (instancetype)init
{
self = [super init]; // self == nil == 0
if (self) {
    // 初始化子类
    _age = 6;
}
return self;
}
 */
//第三种写法:常用的写法
- (instancetype)init
{
//    self = [super init];
// 注意: 不要把 = 号写为 ==
// 一定要将[super init]的返回值赋值给self
if (self = [super init]) {
    // 初始化子类
    _age = 6;
}
return self;
}

@end

例子:

Person.m
#import "Person.h"

@implementation Person

- (instancetype)init
{
if (self  = [super init]) {
    _age = 10;
}
return self;
}

- (NSString *)description
{
return [NSString stringWithFormat:@"age = %i", _age];
}
@end
Studnet.m
#import "Studnet.h"

@implementation Studnet

- (instancetype)init
{
if (self = [super init]) {
    
    //注意:这里不能直接访问父类的_age属性,因为被@property生成的成员变量是私有变量(和private不同的)只能在自己的那个类中可见和访问,才其他类中不可见,更不能直接访问了。所以这里想给_age赋值可以用self调用_age的setter方法。
    
//        [self setAge:10];不过这里不用调用setter方法因为super就是父类,父类中已经初始化_age了
    
    _no = 1;
}
return self;
}

- (NSString *)description
{
return [NSString stringWithFormat:@"age = %i , no = %i", [self age], _no];
}
@end
上一篇下一篇

猜你喜欢

热点阅读