美文网首页
id和instancetype

id和instancetype

作者: 康小曹 | 来源:发表于2020-11-04 10:22 被阅读0次

id

id 的定义如下:

/// Represents an instance of a class.
struct objc_object {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;
};

typedef struct objc_object *id;

很明显,id 就是一个结构体指针,代表一个类的实例。而 NSObject 的定义为:

typedef struct objc_object NSObject;

所以,在 iOS 中,id 可以指代任何的实例对象。

这里需要注意的是实例,而不是类,因为类是 Class:

struct objc_class {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    Class _Nullable super_class                              OBJC2_UNAVAILABLE;
    const char * _Nonnull name                               OBJC2_UNAVAILABLE;
    long version                                             OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    long instance_size                                       OBJC2_UNAVAILABLE;
    struct objc_ivar_list * _Nullable ivars                  OBJC2_UNAVAILABLE;
    struct objc_method_list * _Nullable * _Nullable methodLists                    OBJC2_UNAVAILABLE;
    struct objc_cache * _Nonnull cache                       OBJC2_UNAVAILABLE;
    struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE;
#endif
}

typedef struct objc_class *Class;

类用 objc_class 结构体表示,实例用 objc_object 表示;

instancetype

instancetype 是编译器特性,虽然转为 c++ 文件之后有 instancetype,但是在 objc4 源码中是看不到的:

- (instancetype)self;

- (id)self {
    return self;
}

如上,最终还是变成了 id 类型。

总结

  1. 两者相同点都是可以指代 OC 中的对象实例;
  2. id 本质是结构体,所以表示不了具体的类型;
  3. instancetype 是编译器特性,可以推断出类型,所以可以方便开发者在书写代码时少写很多类型判断或者是类型强制转换的语句;

相关文章

  • iOS开发总结(一)

    instancetype和id instancetype比id多一个好处:编译器会检测instancetype的真...

  • instancetype和id

    1.相同点 都可以作为方法的返回类型 2.不同点 a.instancetype 可以返回和方法所在类相同类型的对象...

  • instancetype和id

    一、什么是instancetype instancetype是clang 3.5开始,clang提供的一个关键字,...

  • instancetype和id

    相同点: instancetype 和 id 都是万能指针,指向对象,可以表示任何对象类型。 不同点: 1.ins...

  • instancetype和id

    instancetype在类型表示上跟id一样,可以表示任何对象类型;instancetype只能作用在返回值上,...

  • id和instancetype

    id id 的定义如下: 很明显,id 就是一个结构体指针,代表一个类的实例。而 NSObject 的定义为: 所...

  • id 和 instanceType 有什么区别?

    id 和 instanceType 有什么区别? 相同点 instancetype 和 id 都是万能指针,指向对...

  • 07-09、instancetype和id关键字的区别

    instancetype 和 id 都是万能指针 都可以 指向一个对象 instancetype 和 id类型的区...

  • instancetype和id的区别

    //问题1:instancetype和id区别?答:instancetype只能作为返回值而id可以作为属性,参数...

  • 008:instancetype和id

    instancetype和id区别? instancetype在类型表示上,跟id一样,可以表示任何对象类型 in...

网友评论

      本文标题:id和instancetype

      本文链接:https://www.haomeiwen.com/subject/fqowvktx.html