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