知识点: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。

不错的推荐:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,989评论 8 265
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,884评论 1 32
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,879评论 0 9
  • Runtime是什么 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我...
    SuAdrenine阅读 4,415评论 0 3
  • vince是我的初中同学,也是我爱了好几年的人。好几年,我也忘了是几年,总之这几年vince这个名字就像铅块一样重...
    阿媺阅读 3,480评论 0 0

友情链接更多精彩内容