zoukankan      html  css  js  c++  java
  • 知识点:id 和NSObject *对比,以及id <NSObject>介绍

    image
    在obj.h的类文件中,可以看出id类型和NSObject类型的信息。如下:

    类 id

    /// An opaque type(隐含类型) that represents an Objective-C class.
    typedef struct objc_class *Class;
    /// Represents an instance of a class.
    struct objc_object {
        Class _Nonnull isa ;
    };
    /// A pointer to an instance of a class.
    typedef struct objc_object *id;
    

    类 NSObject

    @interface NSObject <NSObject> {
        Class isa ;
    }
    

    协议 NSObject

    @protocol NSObject
    @end
    

    类 NSProxy

    @interface NSProxy <NSObject> {
        Class	isa;
    }
    
    1. id和NSObject对比
    • 从上面的源码可以看出,id是struct objc_object结构体指针,可以指向任何OC对象,当然不包括NSInteger等,因为这些数据类型不是OC对象。另外OC的基类,其实不仅仅就NSObject一个,虽然NSObject是绝大数OC对象的基类,但是还有个NSProxy虚类。
      所以不能说id类型和NSObject *是等价的。
    • id类型的实例在编译阶段不会做类型检测,会在运行时确定,所以id类型是运行时的动态类型。类NSObject的实例会编译期要做编译检查,保证指针指向是其NSObject类或其子类,当然实例的具体类型要在运行期确定,这也是iOS的多态的体现。
    • id指针的会有局限性:调用方法,只能使用中括弧,不能使用点语法。
    1. id <NSObject> 是什么呢?
      这里的NSObject是协议NSObject(protocol)而非类NSObject。所以这里表示是遵守协议NSObject的所以类。另外NSObject类和NSProxy类都是实现了协议NSObject。

    不错的推荐:

  • 相关阅读:
    《Head First》 MVC运用的设计模式
    unity工具 Animator的使用
    服务器搭建 如果搭建KBE开源服务器
    unity 实战图片挖洞Mask(转载)
    unity博客 推荐(不断补充)
    unity实战 UGUI英雄联盟英雄头顶分段式血条
    unity组成 ToLua
    unity实战 UGUI Text 间距和ContentSizeFitter组件的适配
    unity工具 推荐(不断补充)
    各种单例模式的对比分析
  • 原文地址:https://www.cnblogs.com/blogwithstudyofwyn/p/9914783.html
Copyright © 2011-2022 走看看