isa指针在objective-c中

时间:2012-06-12 14:40:38

标签: objective-c ios

从这个参考文献:

  

创建新对象时,会为其分配内存及其内存   实例变量已初始化。对象变量中的第一个   是指向其类结构的指针。这个名为isa的指针给出了   对象访问它的类,并通过类,访问所有的   它继承的类。

从我能理解的阅读thisthis开始,它允许使用内省但是以务实的方式(iOS开发),程序员可以从中获益/理解这个特殊的指针?

4 个答案:

答案 0 :(得分:20)

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

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

答案 1 :(得分:4)

在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

答案 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");

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