Java 是';isa&x27;objective-C中的变量等于';instanceof';在爪哇
简单问题:Objective-C中的“isa”实例变量提供了与Java中的“instanceof”操作符相同的功能,这公平吗?这些是不同的概念 一个是结构的成员,另一个是运算符 要模拟Java中对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
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;