美文网首页
OC--init,initialize,initWithCode

OC--init,initialize,initWithCode

作者: ios_stand | 来源:发表于2017-04-12 10:07 被阅读0次

    1、先把OC的类分清楚各友善么方法
    普通类的方法
    init
    initialize:
    控制器类的方法
    init
    initialize:
    initWithCoder:
    UI控件类的方法
    init
    initialize:
    initWithCoder:
    initWithFrame:
    2、init方法
    每个类被创建的时候就会调用init方法

    Person *p1 = [[Person alloc]init];
    Person *p2 = [[Person alloc]init];
    Person *p3 = [[Person alloc]init];
    Person *p4 = [[Person alloc]init];
    

    打印信息

    2015-10-14 10:42:58.852 afgasdgsdfsd[856:19063] Person---init---Person
    2015-10-14 10:42:58.852 afgasdgsdfsd[856:19063] Person---init---Person
    2015-10-14 10:42:58.853 afgasdgsdfsd[856:19063] Person---init---Person
    2015-10-14 10:42:58.853 afgasdgsdfsd[856:19063] Person---init---Person
    

    在有继承关系的情况下,比如Student类继承Person类,那么在不重写子类的init方法时,创建子类对象

    Person *p1 = [[Person alloc]init];
    Person *p2 = [[Person alloc]init];
    Person *p3 = [[Person alloc]init];
    Person *p4 = [[Person alloc]init];
    Student *s = [[Student alloc] init];
    
    
    - (instancetype)init{
    
        if (self = [super init]) {
            NSLog(@"Person---init---%@",[self class]);
        }
        return self;
    }
    

    打印信息

    2015-10-14 11:00:43.569 afgasdgsdfsd[904:22876] Person---init---Person
    2015-10-14 11:00:43.569 afgasdgsdfsd[904:22876] Person---init---Person
    2015-10-14 11:00:43.569 afgasdgsdfsd[904:22876] Person---init---Person
    2015-10-14 11:00:43.569 afgasdgsdfsd[904:22876] Person---init---Person
    2015-10-14 11:00:43.569 afgasdgsdfsd[904:22876] Person---init---Student
    

    我们可以看到再一次调用了父类的init,因为父类帮子类创建了对象。
    如果子类重写了init方法,也会先调用父类的init。

    3、initialize:
    这个类跟init经常混淆,但是还是有区别的,我们先看看调用的书序

    #import "Person.h"
    
    @implementation Person
    - (instancetype)init{
    
        if (self = [super init]) {
            NSLog(@"Person---init---%@",[self class]);
        }
        return self;
    }
    
    + (void)initialize{
    
        if ( self == [Person class]) {
            NSLog(@"Person----initialize---%@",[self class]);
        }
    }
    @end
    

    打印信息

    2015-10-14 11:00:43.568 afgasdgsdfsd[904:22876] Person----initialize---Person
    2015-10-14 11:00:43.569 afgasdgsdfsd[904:22876] Person---init---Person
    2015-10-14 11:00:43.569 afgasdgsdfsd[904:22876] Person---init---Person
    2015-10-14 11:00:43.569 afgasdgsdfsd[904:22876] Person---init---Person
    2015-10-14 11:00:43.569 afgasdgsdfsd[904:22876] Person---init---Person
    

    我们可以看到先打印initialize:方法,而且只打印的一次,为什么呢?
    在程序运行过程中,它会在你程序中每个类调用一次initialize。这个调用的时间发生在你的类接收到消息之前,但是在它的超类接收到initialize之后。
    系统在第一次使用这个类的时候调用(一个类只会调用一次)
    如果在有继承关系的情况下有三种
    一、父类重写:只有父类调用
    二、子类重写:只有子类调用
    三、父子类重写:父子类调用

    #import "Person.h"
    
    @implementation Person
    - (instancetype)init{
    
        if (self = [super init]) {
            NSLog(@"Person---init---%@",[self class]);
        }
        return self;
    }
    
    + (void)initialize{
    
        if ( self == [Person class]) {
            NSLog(@"Person----initialize---%@",[self class]);
        }
    }
    @end
    
    Alex 2015/10/14 11:17:25
    #import "Student.h"
    
    @implementation Student
    
    - (instancetype)init{
    
        if (self = [super init]) {
            NSLog(@"Student---init");
        }
        return self;
    }
    
    
    + (void)initialize{
    
        if ( self == [Student class]) {
            NSLog(@"Student----initialize---%@",[self class]);
        }
    }
    @end
    
    Person *p1 = [[Person alloc]init];
        Person *p2 = [[Person alloc]init];
    
        Student *s = [[Student alloc] init];
    
    2015-10-14 11:17:54.500 afgasdgsdfsd[970:26330] Person----initialize---Person
    2015-10-14 11:17:54.501 afgasdgsdfsd[970:26330] Person---init---Person
    2015-10-14 11:17:54.501 afgasdgsdfsd[970:26330] Person---init---Person
    2015-10-14 11:17:54.501 afgasdgsdfsd[970:26330] Student----initialize---Student
    2015-10-14 11:17:54.502 afgasdgsdfsd[970:26330] Person---init---Student
    2015-10-14 11:17:54.502 afgasdgsdfsd[970:26330] Student---init
    

    4、initWithCoder:
    这个方法时遵守了NSCoding协议 作用:通过xib或者storyboard创建UI控件就会调用这个方法

    5、initWithFrame:
    一般创建UI对象有两种方式。
    一种是通过nib,一种是通过代码。
    如果是通过代码创建,那么就会调用这个方法,进行frame的部署,还有控件的创建。但是在这个方法中创建控件并且设置尺寸的话,你会发现UI控件不会显示。为什么呢?因为initWithFrame:调用时,frame是0,没有尺寸的,所以根据这个frame设置UI控件的frame自然也为空。一般在这个方法中初始化UI控件。在layoutSubviews方法设置UI控件的frame。

    /**
     *  通过代码创建控件的时候就会调用
     */
    - (id)initWithFrame:(CGRect)frame
    {
        if (self = [super initWithFrame:frame]) {
            // 初始化UI控件
        }
        return self;
    }
    
    /**
     *  UI控件重新部署
     */
    - (void)layoutSubviews{
    
        [super layoutSubviews];
        // 设置UI控件的frame
    }
    

    相关文章

      网友评论

          本文标题:OC--init,initialize,initWithCode

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