• iOS 初始化(init、initWithNibName、initWithCoder、initWithFrame)


    很多朋友如果是初学iOS开发,可能会被其中的几个加载方法给搞得晕头转向的,但是这几个方法又是作为iOS程序员必须要我们掌握的方法,下面我将对这几个方法做一下分析和对比,看看能不能增加大家对几个方法的理解和使用.

    一、初始化-加载了什么

    //加载带有xib的控制器
    -(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;
    //(控制器的View为空的时候调用,帮控制器加载View)
    -(void)loadView;
    //代码使用创建控件alloc init 时,系统底层调用init方法
    -(instancetype)init;
    //是当从nib文件中加载对象的时候会调用
    -(instancetype)initWithCoder:(NSCoder *)aDecoder;
    //(当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象)
    -(void)awakeFromNib;
    //(代码创建View时调用,是懒加载,只有到需要显示时,子控件才不是 nil)
    - (instancetype)initWithFrame:(CGRect)frame;

    二、加载方式以及调用顺序

    1.带有xib的storyboard的ViewController,重点是是一个控制器,不是一个View。

    我们创建初始化一个控制器:   ViewController *vc =[ [ViewController alloc]init];

    在这个加载过程中,相关方法的调用:

    1 -(instancetype)init;
    2 
    3 -(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;//加载带有xib的控制器(默认ViewController)
    4
    5 -(void)loadView; //加载控制器视图
    6
    7 - (void)viewDidLoad;

    2.加载.xib的ViewController,此出和第一种方式有出入,可以看图片,所示

    这个过程加载的相关方法

     XiBViewController *vc =[[XiBViewController alloc]initWithNibName:@"XiBViewController" bundle:nil];
    //调用顺序
    initWithNibName:bundle: 
    loadView 
    viewDidLoad

    注意:这里关于xib的加载,我们要知道,我在这里是将xib文件命名为jtest,但是一般来说,创建自定义控制器的时候xib的命名是和自定义控制器是同名的,如果xib和自定义控制器同名,那么此时我们就可以直接init创建不需要指定xib的名字:

    XiBViewController *vc = [[XiBViewControlleralloc] init];

    可以这样做的原因是,系统在底层首先调用init方法,在init方法内部自动会调用(initWithNibName)方法,首先系统先看看是否有指定名字的xib,如果没有就加载控制器同名但是去掉Controller的xib,还没有就加载与控制器同名的xib

    3.init和initWithFrame方法
    首先当代码创建控件时,会有init,此时会底层调用init方法,但是init又会在内部调用initWithFrame方法,总的来说,两个方法中作用都是对控件进行创建,在实际开发中可以将控件的创建直接写在initWithFrame方法即可

    4. initWithFrame和initWithCoder方法

    我们在创建UIVIew的时候,一般会使用两种方式:一种是代码,一种是拖控件(interface builder也就是使用nib文件的方式),我们时候拖控件的方式此时initWithFrame方法不会被调用,因为nib文件知道如何初始化该view(拖控件的时候已经定义好了长度高等属性),使用拖控件的方式会调用initWithCoder方法,在该方法中可以重新定义我们在nib中已经设置的各项属性
    在使用代码进行view的创建的时候需要注意:当我们创建UIView的子类的时候,我们使用initWithFrame方法实例化UIVIew,并且特别注意:如果在子类中重载initWithFrame方法,必须先调用父类的initWithFrame方法,否则会出现一些意想不到的问题,看看使用initWithFrame创建的一般代码格式:


    JNView.m: 
    #import "JNView.h" 
    @implementation JNView 
    - (instancetype)initWithFrame:(CGRect)frame{ 
    self = [super initWithFrame:frame]; 
    //在该方法中进行初始化设置 
    return self; 
    } 
    @end

    最后总结:

    1、initWithFrame只适用纯代码创建时调用,不涉及xib或storyboard。

    2、initWithCoder、awakeFromNib是从xib、storyboard中创建时会调用。

    3、所以一般来说,为了安全起见,初始化控件的代码我们写在一个方法里面(类似我上面的initViews方法),然后我们分别在initWithFrame和initWithCoder中都调用一下,这样就保证了无论你是通过什么方式创建的控件,代码都能起到作用。

     

  • 相关阅读:
    程序保护机制
    ubuntu单独安装DDMS
    Linux Syste m Call Table
    任意程序添加ShellCode
    解析结构化异常处理(SEH)(第一部分)
    CONTEXT(线程结构体)
    WINNT.H
    Html的空格显示
    随机变量的联合分布
    期望和期望的性质
  • 原文地址:https://www.cnblogs.com/henusyj-1314/p/9928514.html
Copyright © 2020-2023  润新知