isa指针在objective-c中

从这个参考:

创建新对象时,将分配其内存,并初始化其实例变量。 对象变量中的第一个是指向其类结构的指针。 这个名为isa的指针使对象可以访问它的类,并通过该类访问它inheritance的所有类。

从我能理解的内容中读到这个和它 ,它允许一个人使用内省但是以务实的方式(iOS开发), 程序员可以从知道/理解这个特殊指针中获益吗?

真正的好处是更好地理解Objective-C运行时,与C ++等静态语言相比,它实际上相当复杂。 实际上, isa指针实际上并没有真正使用,除非你正在攻击运行时做一些特别的事情。 本指南提供了有关运行时如何使用它的更多信息。

您不应该直接在生产代码中使用isa 。 这就像retainCount – 重要的是你了解它,但你不应该称之为。

在64位环境中,不应访问对象的ISA字段。 ISA字段不再包含指针。 它包括一些指针数据,并使用其余位来保存其他运行时信息。 CLASS属性或OBJECT_GETCLASS函数可用于读取isa字段。 OBJECT_SETCLASS可用于编写isa字段。

参考: https : //developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/ConvertingYourAppto64-Bit/ConvertingYourAppto64-Bit.html#//apple_ref/doc/uid/TP40013501-CH3-SW1

在运行时,当一个消息发送到一个对象时,该对象转到创建它的类,并说:“我收到了这条消息。运行匹配方法的代码。” 这与大多数编译语言不同,后者在编译时确定要执行的方法。


一个对象如何知道哪个类创建它?

它使用isa指针。 每个对象都有一个名为isa的实例变量。 创建对象时,该类将返回对象的isa实例变量设置为指向该类。 它被称为isa指针,因为对象“是该类的实例”。 虽然你可能永远不会明确地使用isa指针,但它的存在使Objective-C获得了很大的function。


如果对象的类(由其isa指针指向)实现关联的方法,则该对象仅响应消息。 因为这在运行时发生,所以XCode不能总是在编译时(构建应用程序时)弄清楚对象是否会响应消息。 如果XCode认为您正在向不响应的对象发送消息,则会给您一个错误,但如果它不确定,它将让应用程序构建。


如果由于某种原因(并且有很多可能性),您最终会向没有响应的对象发送消息,您的应用程序将抛出异​​常。 所以isa指针是运行时错误的原因。 让我们在这里查看详细信息和示例: IOS – Objective-C – exception和无法识别的选择器

isa指向类对象,因此这将起作用

 if(self->isa == [self class]) NSLog(@"True"); 

了解如何使用它,会有一些好处,例如对所创建对象的类对象进行内省和测试