加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – 为什么id是通用指针?

发布时间:2020-12-16 05:41:08 所属栏目:百科 来源:网络整理
导读:我想知道为什么id是一个弱引用指针,它如何处理任何类类型的指针,在运行时如何检测哪个类指针被分配给id. 解决方法 Why is id a weak reference pointer? id不是一个弱参考指针,至少不是在ARC所有权.是否对对象的id类型引用很弱取决于已被声明为__weak(和变体
我想知道为什么id是一个弱引用指针,它如何处理任何类类型的指针,在运行时如何检测哪个类指针被分配给id.

解决方法

Why is id a weak reference pointer?

id不是一个弱参考指针,至少不是在ARC所有权.是否对对象的id类型引用很弱取决于已被声明为__weak(和变体)的引用以及对象的类实际支持弱引用.

但是,您可以说,id提供了弱类型,尽管我认为动态/鸭型打字是一个更准确的描述.由于id类型引用不包含编译时类类型信息,因此编译器无法确定底层对象是否可以响应给定的选择器,这可能会导致运行时错误.

How is it able to handle any class type pointer?

这是the Objective-C language的定义的一部分.编译器将id视为每个Objective-C类的超类型,并将其视为不同的id.参见下面的答案.

At runtime,how can we detect that which type of class pointer is assigned to id?

在Apple的Objective-C运行时,分配给对象的内存中的第一个字节必须指向该对象的类.您可能会看到其他地方被引用为isa指针,这就是Apple的运行时发现每一个对象的类. id类型也被定义为具有这些信息.事实上,它唯一的属性是isa指针,这意味着all1的Objective-C对象符合这个定义.

如果你有一个id参考,并想要发现引用对象的类,你可以发送它-class:

id someObject;

// Assign something to someObject

// Log the corresponding class
Class c = [someObject class];
NSLog(@"class = %@",c);

// Test whether the object is of type NSString (or a subclass of NSString)
if ([someObject isKindOfClass:[NSString class]]) {
    NSLog(@"it's a string");
}

1Tagged pointers是这种结构的显着偏差,(部分)因为它们不应该直接访问isa指针.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读