知识点:id 和NSObject *对比,以及id 介绍

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

类 idobjective-c

/// 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;
复制代码

类 NSObjectapp

@interface NSObject <NSObject> {
    Class isa ;
}
复制代码

协议 NSObjectspa

@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。

不错的推荐:code

相关文章
相关标签/搜索