zoukankan      html  css  js  c++  java
  • id instancetype NSObject *的区别

    1、instancetype只能用于方法的返回类型,而id用处和NSObject *类似。

    2、instancetype会告诉编译器当前的类型,这点和NSObject *类似,但id对于编译器却是无类型的,调用任何方法不会给出错误提示。

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

    4、NSObject Class和id都是仅包含了一个Class isa。但NSObject 包含了更多方法的定义。

    5、id和instancetype都能省去具体类型,提高代码的通用性。而这是NSObject *不及的。

    6、id 是 Objective-C 对象,但是并不一定是NSObject对象,并非所有的Foundation/Cocoa对象都是继承于NSObject对象的,比如NSProxy。同时,id与NSObject对象之间有很多的共同方法,比如retain与release等方法。更一步来说:所有的对象本质来说都是 id 类型的。

     

    从iOS的SDK头文件中,我们能看到一些定义 

    在objc.h中,可以看到id的定义如下 

     typedef struct objc_class *Class; 

    typedef struct objc_object { 

        Class isa; 

    } *id; 

     

     

    在NSObject.h中,可以看到NSObject类的定义如下 

    @interface NSObject <NSObject> { 

        Class isa; 

    + (void)load; 

    + (void)initialize; 

    - (id)init; 

    + (id)new; 

    + (id)allocWithZone:(NSZone *)zone; 

    + (id)alloc; 

    - (void)dealloc; 

     // 很多其它方法

     @end 

     

     两个类型都含有Class isa,但NSObject同时包含了一些其它的方法,并需要实现NSObject协议。 

    所以NSObject*可以用id来表示。但id不能用NSObject*来表示。 

  • 相关阅读:
    SysUtils.CompareText的注释
    获取进程列表及相关信息
    基于OpenCV的视频图像组态 (4) :劈裂动画效果
    基于OpenCV的视频图像组态 (3):常见PPT动画1
    基于OpenCV的视频图像组态 (2) :动画总体
    基于OpenCV的视频图像组态 (1) :时钟
    基于meanshift的手势跟踪与电脑鼠标控制(手势交互系统)
    小型便携式交互板安装设计
    小型便携式交互板安装设计
    乂文®便携触摸屏
  • 原文地址:https://www.cnblogs.com/CoderCLsun/p/5838223.html
Copyright © 2011-2022 走看看