zoukankan      html  css  js  c++  java
  • init,initialize,initWithFrame,initWithCoder,awakeFromNib等区别

    1.init 与initialize

    对于iOS程序,创建几个类对象,就会调用几次init。下面分别重写 举例如下:

    创建一个Person类,分别重写initialize和init方法

    #import "Person.h"  
      
    @implementation Person  
      
    +(void)initialize {  
         NSLog(@"%s", __FUNCTION__);   
    }  
      
    -(instancetype)init {  
        NSLog(@"%s", __FUNCTION__);  
        return  self;  
    }  @end  

     然后创建Person类的两个对象实例

    - (void)viewDidLoad {  
        [super viewDidLoad];  
          
        Person *p1 = [[Person alloc]init];  
        Person *p2 = [[Person alloc]init];  
      
    }  

    经过运行,我们可以看到如下结果

    虽然我们创建两个实例,但是initialize仅仅被调动了一次,也可以看到,直至我们创建一个Person的实例时,initialize才被调用。

    (2)拓展:

    如果Person有一个子类的话,比如叫Teacher

    #import "Person.h"  
    @interface Teacher : Person  
    @end  
    
    #import "Teacher.h"  
    @implementation Teacher  
      
    @end  

    注意:在Teacher的.m文件中,并没有实现initialize方法

    我们同样创建Teacher类的一个实例对象

    Teacher *t = [[Teacher alloc]init];  

    此时再次输出结果如下:

    从这个结果可以看出有3个init与2个initialize,如果一个子类没有实现initialize,那么父类会调用这个方法两次,一次为自己,一次为子类。

    2.init与initWithFrame

    这是一个自定义的View

    @implementation MyView
    - (instancetype)init {
        if (self = [super init]) {
            NSLog(@"调用了init");
        }
        return self;
    }
    
    - (instancetype)initWithFrame:(CGRect)frame {
        if (self = [super initWithFrame:frame]) {
            NSLog(@"调用了initWithFrame");
        }
        return self;
    }
    
    @end

    如今我调用它的init方法

    MyView *myView = [[MyView alloc] init];

    结果如下:

    代码的调用顺序如下:

    (1)动态查找MyView的init方法

    (2)调用super init方法

    (3)super init方法内部执行的是[super initWithFrame:CGRectZero];

    (4)然后super会发现MyView实现了initWithFrame方法

    (5)转而执行 [MyView initWithFrame:CGRectZero]

    (6)最后执行init其余部分

    init 内部会调用父类的 initWithFrame: 方法,只不过传入的 frame 的值为0,然后父类的 initWithFrame: 方法发现当前的调用对象是子类对象,所以就调用了子类的initWithFrame方法了。这是一个多态的应用。

    3.initWithFrame,initWithCoder与awakeFromNib区别

    一般创建UI对象有两种方式。 一种是通过代码。 

    如果是通过代码创建,那么就会调用这个方法,进行frame的部署------initWithFrame调用,

    UIView *v= [[UIView alloc]initWithFrame:CGRectMake(0,0,Screen_Width,Screen_Heigth)];
    - (id)initWithFrame:(CGRect)frame
    {
        if (self =[superinitWithFrame:frame]) {
            
        }
        return self;
    }
    一种是通过nib,通过拖拽控件模式,initWithCoder与awakeFromNib方法
    首先initWithCoder  再然后- awakeFromNib唤醒这些实例对象。
  • 相关阅读:
    【工具篇】利用DBExportDoc V1.0 For MySQL自动生成数据库表结构文档(转
    PHP Client for Mysql Binlog
    MySQL的binlog日志恢复(转)
    Linux 普通进程 后台进程 守护进程(转)
    实战:MySQL Sending data导致查询很慢的问题详细分析(转)
    mysql索引无效且sending data耗时巨大原因分析
    阿里云-DRDS(转)
    MySQL查看SQL语句执行效率(转)
    nginx php-fpm 输出php错误日志(转)
    Golang指针基本介绍及使用案例
  • 原文地址:https://www.cnblogs.com/guohai-stronger/p/8119104.html
Copyright © 2011-2022 走看看