• iOS 初始化方法


    [[类名 alloc] init]; 向类发送 alloc 方法,创建该类的实例并得到指向该实例的指针;之后向创建的该实例发送 init 消息,为实例变量初始化。

    init, initWithStyle, initWithNibName ...

    很多类有多个初始化方法,能以不同的形势初始化对象,每个初始化方法都以 init 开头(iOS 的命名约定)。

    所有的类,无论有多少个初始化方法,都必须选定一个作为“指定初始化方法” ,以 NSObject 为例,因为只有一个初始化方法 init ,所以 init 就是指定初始化方法

    也可以自定义类的初始化方法,例如  - (id)initWithObjectName:(NSString *)name Number:(int)value; //方法名或叫选择器。

    init 方法返回的类型,永远为 (id) :

    为什么不能返回类型 (Object *) 指向该对象的指针,因为 Object 类 的子类会继承 Object 的全部方法,包括初始化方法和返回类型,如果 Object 子类的实例收到了该初始化方法,那么应该返回相应子类的实例;可不可以向C++一样覆盖父类的初始化方法,不可以!因为在 OC 中,一个对象不能同时有两个名字相同的方法(选择器),即使他们的返回类型或参数不同。将初始化方法中的返回类型设置为 (id)任意对象,就能解决这种创建子类时会遇到的问题。

    isa 实例变量:

    每个对象都拥有一个名为 isa 的实例变量。类在收到 alloc 消息并创建对象后,会设置新建对象的实例变量 isa,指向自己(创建该对象的类)。

    isa 意为 (is a),通过该成员变量,可以知道对象 “是” 哪个类的实例。

    OC 的很多特性都源自 isa 指针,在运行环境下,对象收到消息后会根据 isa 指针指向的类,执行和该消息匹配的方法。

    #初始化方法中的关键字#:

    self : 存在于方法中,是一个(隐式 “ implicit ”)局部变量,它不需要声明,而且会自动赋值,指向收到消息的对象自身(类似C++中的 “this”)。通常可以通过 self 向对象自己发送消息。

    super :在覆盖子类的某个方法时,需要在父类现有方法已经实现的功能基础上,增加其他功能,为了能方便的完成这个任务 。OC 提供了一个 名为 super 的编译器指令 ; super 的工作方式,当对象收到启动方法查询,从收到消息的对象开始查询与消息同名的方法,未找到,会继续向其父类查找,一直到NSObject ,如果一直未找到,则会抛出异常。

    初始化方法链:

    比如 Object 的指定初始化方法是  - (id)initWithObjectName:(NSString *)name Number:(int)value; 

    此外还有另一个初始化方法 init (继承自 Object 的父类 NSObject),向 Object 的实例发送 init 消息并不会执行指定的初始化方法的代码。应该覆盖 init 方法的实现,用默认值调用指定的初始化方法:

    - (id)init
    
    {
      return [self initWithObjectName:@"objectName" Number:0];
    }

    这种“串联”使用初始化方法的机制可以降低出错的几率,也能让代码更容易维护,对于有多个初始化方法的类,程序员在创建时要选中某个初始化方法为“指定初始化方法”,只在指定初始化方法中编写初始化核心代码,其他初始化方法只需有默认值调用该核心即可。

     

  • 相关阅读:
    javacv 通过rtsp 获取视频流 设置帧率
    Firefly-RK3399 上编译安装 OpenCV 3
    萤火虫系统(firefly) RK3399 python3 安装 tensorflow
    Linux环境创建交换分区
    python模块发布
    Docker学习
    好书收集
    python 内存管理和垃圾回收机制
    redis加分布式锁
    邀请关系设计
  • 原文地址:https://www.cnblogs.com/dayw/p/3232322.html
Copyright © 2020-2023  润新知