美文网首页
OC中的构造方法

OC中的构造方法

作者: 哈利_ | 来源:发表于2017-05-27 11:48 被阅读0次

    最近在学习OC的东西,过程中也有很多不了解的知识,在这里记录一下,如果能帮到一些和我经历差不多的人,也是很不错的~


    1.OC中的初始化方法

    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            
            Student *s2 = [Student new];
            Student *s1 = [[Student alloc]init]; 
        }
        return 0;
    }
    

    这里的new方法和 alloc init 方法所表达的意思是一样的,但是通常我们会选择第二种写法,因为当我们在重写构造方法的时候,会传进一些参数,但是new方法根本不会调到. 故此我们不选择第一种方法

    alloc方法是一个类方法,alloc部分用option+click点击进去显示详情, 声明的方法是:

    + (instancetype)alloc; 
    

    作用: 哪一个类调用这个方法,就创建哪个类的对象,并把对象返回

    init方法是一个对象方法,声明的方法:

     - (instancetype)init; 
    

    作用: 初始化对象 为对象赋初始值

    对象类型 | 初始值
    -----|-----|-----
    基本数据类型 | 0
    C指针 | NULL
    OC指针 | nil

    所以我们如果创建一个对象如果没有为这个对象的属性赋值时,这个对象的属性是有默认值的


    2.构造方法

    如果我们想要让创建的对象属性的默认值不是 NULL/nil/0,而是我们自定义的,那么这个时候我们可以重写init方法,在这个方法中按照我们自己的想法为这个对象的属性赋值.
    从写init方法的规范:
    1).必须要调用父类init方法
    2).将方法的返回值赋值给self

    - (instancetype)init
    {
    self = [super init]; 
    }
    

    这样就达到了上面所说的两条规范
    但是有一点需要注意的是,调用init方法初始化对象有可能会失败,如果初始化失败,返回的就是nil, 所以我们有第三点规范:
    3).判断父类是否初始化成功,判断self是否为nil,如果不为nil则初始化成功

    @implementation Student
    
     1. (instancetype)init
    {
        self = [super init];
        if (self != nil) {
            self.name = @"Jack";
        }
        return self;
    }
    @end
    

    3.重写构造方法

    当我们需要在在构造方法中传入一些参数的时候,就需要我们自己重写构造方法,添加一些可传入的参数
    规范:
    1). 自定义构造方法的返回值必须是instancetype
    2). 自定义构造方法的名称必须以initWith开头 W要大写 小写报错!
    3). 方法的实现和init的要求一样

    //.h文件
    @interface Student : NSObject
    
    @property NSString *name;
    @property int age;
    
    -(instancetype)initWithName:(NSString *)name andAge:(int)age;
    @end
    
    //.m文件
    #import "Student.h"
    @implementation Student
    
    - (instancetype)initWithName:(NSString *)name andAge:(int)age
    {
        if (self = [super init]) {
            self.name = name;
            self.age = age;
        }
        return self;
    }
    @end
    
    //main.m中调用
    #import <Foundation/Foundation.h>
    #import "Student.h"
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            
            Student *s1 = [[Student alloc]initWithName:@"小黄" andAge:18];
        }
        return 0;
    }
    

    最后,@property这个语法,到现在还不是很明白,那下个博客的内容就是关于property的了~

    相关文章

      网友评论

          本文标题:OC中的构造方法

          本文链接:https://www.haomeiwen.com/subject/btfqfxtx.html