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