17

从这个参考:

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

根据我对thisthis的理解,它允许使用自省但以务实的方式(iOS 开发),程序员可以从了解/理解这个特殊指针中受益什么?

4

4 回答 4

22

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

您不应该真正isa在生产代码中直接使用。这就像retainCount- 你理解它很重要,但你不应该称之为它。

于 2012-06-12T14:43:32.350 回答
5

在 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

于 2015-04-08T13:49:02.483 回答
5

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


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

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


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


如果由于某种原因(并且有很多可能性),您最终向不响应的对象发送消息,您的应用程序将引发异常。所以isa指针是运行时错误的原因。让我们在这里查看详细信息和示例:IOS - Objective-C - Exceptions And Unrecognized Selectors

于 2016-01-23T18:05:44.310 回答
3

isa 指向类对象,所以这可以工作

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

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

于 2012-06-12T14:43:07.433 回答