zoukankan      html  css  js  c++  java
  • id 和 instancetype

    静态数据类型

      默认情况下所有的数据类型都是静态数据类型

      静态数据类型的特点:

        1 在编译时就知道变量的类型

        2 知道变量中有哪些属性和方法

        3 在编译的时候就可以访问这些属性和方法

        4 并且如果是通过静态数据类型定义变量,如果访问了不属于静态数据类型的属性和方法,那么编译器就会报错

    动态数据类型

      id 是一个动态数据类型

      动态数据类型的特点

        1 在编译的时候编译器并不知道变量的真实类型,只有在运行的时候才知道它的真实类型

        2 并且如果通过动态数据类型定义变量,如果访问了不属于动态类型的属性和方法, 编译器不会报错

    id

    1 id == NSObject *万能指针

    2 id 和  NSObject * 的区别

      NSObject * 是一个静态数据类型

      id 是一个动态数据类型

    3 调用方法

      通过静态数据类型定义变量,不能调用子类特有的方法

      通过动态数据类型定义变量,可以调用子类特有的方法

      通过动态数据类型定义的变量,可以调用私有方法

    4 弊端 :由于动态数据类型可以调用任意方法, 所以有可能调用到不属于自己的方法, 而编译时又不会报错, 所以可能导致 运行时 的错误

    5 应用场景:多态,可以减少代码量,避免调用子类特有的方法需要强制转换

    6 判断:为了避免动态数据类型引发的运行时的错误,一般情况下如果使用动态数据类型定义一个变量,在调用这个对象的方法之前会进行一次判断,判断当前对象是否可以调用这个方法(即判断是否为定义类或者其子类)

    instancetype

    1 init 方法的返回值是 instancetype,将返回值赋值给一个其他的对象会报警号

    2 instancetype == id == 万能指针 == 指向一个对象

    3 注意:以后但凡是自定义构造方法,返回值尽量使用 instancetype ,不要使用 id

    id 和 instancetype 的区别

    1 id在编译的时候不能判断对象的真实类型

    2 instancetype 在编译的时候可以判断对象的真实类型

    3 id 可以用来定义变量,可以作为返回值,可以作为形参

    4 instancetype 只能用于作为返回值

    5 对于 init 方法,id 和 instancetype 是没有区别的,因为编译器会把 id 优化成 instancetype。当明确返回的类型就是当前 Class 时,使用 instancetype 能避免 id 带来的编译不出的错误情况

  • 相关阅读:
    C语言基础---字符指针变量和字符数组的区别
    C语言基础---编写C语言代码过程中易忽略的点
    C语言简介---通过指针引用多维数组
    C语言基础---特殊的变量类型(结构体、枚举、共用体)
    C语言基础---指针简述
    C语言基础---C语言中的变量与内存空间的关系
    嵌入式开发中常用到的C语言库函数
    SVN使用---简介
    视频编解码相关基础知识(二)---H.264简介
    MybatisPlus MetaObjectHandler 配置
  • 原文地址:https://www.cnblogs.com/chenbowen/p/6029801.html
Copyright © 2011-2022 走看看