isa指针在objective-c中

Rui*_*res 16 objective-c ios

从这个参考:

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

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

Ash*_*row 20

真正的好处是更好地理解Objective-C运行时,与C++等静态语言相比,它实际上相当复杂.该isa指针,在实际应用中,是不是真的,除非你是黑客运行时做一些特别的使用所有的东西.本指南提供了有关运行时如何使用它的更多信息.

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

  • 指南+1.像许多花费一些时间来进行stackoverflow的人一样,我想知道"兔子洞有多深". (2认同)

小智 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


Nam*_*YNH 5

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


对象如何知道是哪个类创建的?

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


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


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