从这个参考:
当一个新对象被创建时,它的内存被分配,它的实例变量被初始化。对象变量中的第一个是指向其类结构的指针。这个称为 isa 的指针使对象可以访问其类,并通过该类访问它所继承的所有类。
根据我对this和this的理解,它允许使用自省但以务实的方式(iOS 开发),程序员可以从了解/理解这个特殊指针中受益什么?
真正的好处是更好地理解 Objective-C 运行时,与 C++ 等静态语言相比,它实际上相当复杂。isa
实际上,指针并没有真正使用那么多,除非你正在破解运行时做一些特别的事情。本指南包含有关运行时如何使用它的更多信息。
您不应该真正isa
在生产代码中直接使用。这就像retainCount
- 你理解它很重要,但你不应该称之为它。
在 64 位环境中,不应访问对象的 ISA 字段。ISA 字段不再包含指针。它包括一些指针数据并使用剩余的位来保存其他运行时信息。CLASS 属性或 OBJECT_GETCLASS 函数可用于读取 isa 字段。OBJECT_SETCLASS 可用于写入 isa 字段。
在运行时,当消息被发送到一个对象时,该对象会转到创建它的类并说:“我收到了这条消息。运行匹配方法的代码。” 这与大多数编译语言不同,其中要执行的方法是在编译时确定的。
对象如何知道哪个类创建了它?
它使用它的isa指针。每个对象都有一个名为 isa 的实例变量。创建对象时,该类将返回对象的 isa 实例变量设置为指向该类。它被称为 isa 指针,因为对象“是”该类的实例。尽管您可能永远不会显式使用 isa 指针,但它的存在使 Objective-C 获得了很大的力量。
一个对象只有在它的类(由它的 isa 指针指向)实现了相关的方法时才响应消息。因为这发生在运行时,XCode 不能总是在编译时(构建应用程序时)确定对象是否会响应消息。如果 XCode 认为您正在向一个不会响应的对象发送消息,它将给您一个错误,但如果不确定,它将让应用程序构建。
如果由于某种原因(并且有很多可能性),您最终向不响应的对象发送消息,您的应用程序将引发异常。所以isa指针是运行时错误的原因。让我们在这里查看详细信息和示例:IOS - Objective-C - Exceptions And Unrecognized Selectors
isa 指向类对象,所以这可以工作
if(self->isa == [self class])
NSLog(@"True");
了解如何使用它会有一些好处,例如对创建对象的类对象进行自省和测试