iPhone iOS如何将Class对象与另一个类对象进行比较?

时间:2012-04-26 17:14:55

标签: iphone objective-c ios class

我在其中一个使用以下类的类中定义了类引用:

Class _objectClass;

     if([self.objectClass isSubclassOfClass:[NSManagedObject class]])
        {
           //does not get called
        }

如何查看我正在处理的Class是什么类型?

更新:对不起自动完成没有告诉我isKindOfClass:可用。我现在正在测试

2 个答案:

答案 0 :(得分:28)

您有两种方法感兴趣:

isKindOfClass:询问接收者是否是类或子类,其中isMemberOfClass:询问接收者是否是类,但不是子类。例如,假设您拥有名为objectClass的NSManagedObject子类。

 if([self.objectClass isKindOfClass:[NSManagedObject class]]) {
     // This will return YES
 }
 else if ([self.objectClass isMemberOfClass:[NSManagedObject class]]) {
     // This will return NO
 }

第一个语句返回YES(或true或1),因为objectClass是NSManagedObject的子类。第二个语句返回NO(或false,或0),因为虽然它是一个子类,但它本身不是类。

更新: 我想更新这个答案,为下面的评论带来亮点,这说明这个解释是错误的,因为以下代码行:< / p>

if ([self.class isKindOfClass:self.class])

会返回false。这是正确的,它会返回false。但这个例子是错误的。从NSObject继承的每个类也符合NSObject协议。在这个协议中有一个名为class的方法,它“返回接收者类的类对象”。在这种情况下,self.class返回自身的任何类对象。但是,请参阅isKindOfClass: -

上的文档
  

返回一个布尔值,指示接收器是否为   给定类的实例或继承自的任何类的实例   那个班。

因此,将此消息发送到self.class(这是一个类)将返回false,因为它意味着要发送到类的实例,而不是类本身。

如果您将示例更改为

if([self isKindOfClass:self.class])

你会得到YES(或者是真,或者1)。

我在这里的回答假定self.objectClass是名为objectClass的实例的访问者。当然,这对于一个类的实例来说是一个可怕的名称,但问题不在于“我如何命名类的实例”。

答案 1 :(得分:1)

是的,[self.objectClass isSubclassOfClass:[NSManagedObject class]]是正确的。如果为false,则表示self.objectClass表示的类不是NSManagedObject的子类。我不明白你的问题是什么,或者你在期待什么。