12

我在使用的类之一中定义了一个类引用:

Class _objectClass;

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

如何检查Class我正在处理的类型?

更新:抱歉,自动完成没有告诉我 isKindOfClass: 可用。我现在正在测试

4

2 回答 2

28

您感兴趣的方法有两种:

isKindOfClass:询问接收者它是一个类还是一个子类,而 asisMemberOfClass:询问接收者它是一个类,而不是一个子类。例如,假设您有NSManagedObject一个名为 objectClass 的子类。

 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),因为虽然它是子类,但它不是类本身。

更新:我想更新此答案以阐明下面的评论,该评论指出此解释是错误的,因为以下代码行:

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

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

返回一个布尔值,指示接收者是给定类的实例还是从该类继承的任何类的实例。

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

如果您将示例更改为

if([self isKindOfClass:self.class])

您将得到 YES(或 true,或 1)。

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

于 2012-04-26T17:19:26.183 回答
2

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

于 2012-05-31T20:03:07.653 回答