我想知道为什么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指针.