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

Ale*_*one 11 iphone class objective-c ios

我在其中一个类中定义了类引用:

Class _objectClass;

     if([self.objectClass isSubclassOfClass:[NSManagedObject class]])
        {
           //does not get called
        }
Run Code Online (Sandbox Code Playgroud)

我该如何检查Class我正在处理什么?

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

jms*_*617 28

您有两种方法感兴趣:

isKindOfClass:询问接收者它是一个类还是一个子类,在哪里isMemberOfClass:询问接收者它是否是类,而不是子类.例如,假设您的NSManagedObject子类名为objectClass.

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

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

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

if ([self.class isKindOfClass:self.class])
Run Code Online (Sandbox Code Playgroud)

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

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

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

如果您将示例更改为

if([self isKindOfClass:self.class])
Run Code Online (Sandbox Code Playgroud)

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

我在这里的答案假设self.objectClass是一个名为objectClass 的实例的访问器.当然,对于类的实例来说,这是一个可怕的名称,但问题不在于"我如何命名类的实例".