Objective-C中的“isa”variables等于Java中的“instanceof”

简单的问题:Objective-C中的“isa”实例variables提供了与Java中的“instanceof”运算符相同的function是否公平?

这些是不同的概念。

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

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

 if(obj->isa == [SomeClass class]) { //obj is an instance of SomeClass } 

但build议您使用NSObject协议的-isMemberOfClass:方法来完成此操作:

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

如果您有兴趣知道指定的类是否是另一个类的实例,或者是另一个类的子类,则应使用NSObject协议的-isKindOfClass:方法。

从Objective-C编程指南:

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

 typedef struct objc_object { Class isa; } *id; 

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

 typedef struct objc_class *Class; 

isavariables通常被称为“isa指针”。

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

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

苹果正在使用一个聪明的技巧来加快速度:他们依靠所有64位不用于地址的事实,所以他们正在使用一些位来存储保留数。 通过这种方式,他们不需要修改单独表中的对象的保留计数,因为这会涉及到所有的性能影响。

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

将isa视为实现细节。 不要直接访问它。 使用-isMemberOfClass:这将做适当的事情(在64位操作系统现在涉及屏蔽部分isa)。

更多信息: http : //www.sealiesoftware.com/blog/archive/2013/09/24/objc_explain_Non-pointer_isa.html