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

前端之家收集整理的这篇文章主要介绍了objective-c – 为什么id是通用指针?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道为什么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指针.

猜你在找的C&C++相关文章