Java 是';isa&x27;objective-C中的变量等于';instanceof';在爪哇

Java 是';isa&x27;objective-C中的变量等于';instanceof';在爪哇,java,objective-c,ios,Java,Objective C,Ios,简单问题:Objective-C中的“isa”实例变量提供了与Java中的“instanceof”操作符相同的功能,这公平吗?这些是不同的概念 一个是结构的成员,另一个是运算符 要模拟Java中对instanceof运算符的严格解释,可以在isa成员上进行指针比较: if(obj->isa == [SomeClass class]) { //obj is an instance of SomeClass } 但建议您使用NSObject协议的方法来实现这一点: if([obj isM

简单问题:Objective-C中的“isa”实例变量提供了与Java中的“instanceof”操作符相同的功能,这公平吗?

这些是不同的概念

一个是结构的成员,另一个是运算符

要模拟Java中对
instanceof
运算符的严格解释,可以在
isa
成员上进行指针比较:

if(obj->isa == [SomeClass class]) {
  //obj is an instance of SomeClass
}
但建议您使用
NSObject
协议的方法来实现这一点:

if([obj isMemberOfClass:[SomeClass class]]) {
  //obj is an instance of SomeClass
}

如果您想知道指定的类是另一个类的实例还是另一个类的子类,您应该使用
NSObject
协议的
-isKindOfClass:
方法。

来自Objective-C编程指南:

id定义为指向对象数据结构的指针:

因此,每个对象都有一个isa变量,告诉它它是一个实例的类。由于类类型本身定义为指针:

isa变量通常被称为“isa指针”


不。
instanceof
更像Objective-C中的
isKindOfClass:
方法,因为它也对子类求值为
true
,而
isa
指针只指向一个类。

在Objective-C运行时的64位实现中,isa变成了64位,与所有其他指针一样

苹果公司正在使用一个聪明的技巧来加快速度:他们依赖于这样一个事实,即所有64位都没有用于地址,所以他们使用一些位来存储诸如retaincount之类的内容。这样一来,他们就不需要在一个单独的表中修改一个对象的保留计数,以及由此产生的所有性能影响

这意味着直接比较isa指针根本不起作用。这对于OS X和现在64位A7(iPhone 5s)上的iOS 7都是如此

将isa视为一个实现细节。不要直接访问它。Use-isMemberOfClass:这将做正确的事情(在64位操作系统中,现在涉及屏蔽isa的一部分)

更多信息:

应该有帮助:
typedef struct objc_object {
  Class isa;
} *id;
typedef struct objc_class *Class;