检查对象是否为类类型

Fel*_*ino 34 c objective-c type-conversion

我有一个接收的方法NSArrayClass对象,我需要检查,如果他们都Class用波纹管生成的代码类型:

NSMutableArray *arr = [[NSMutableArray alloc] init];

[arr addObject:[NSObject class]];
[arr addObject:[NSValue class]];
[arr addObject:[NSNumber class]];
[arr addObject:[NSPredicate class]];
[arr addObject:@"not a class object"];
Run Code Online (Sandbox Code Playgroud)

问题是,这Class不是一个客观的c类,它是一个结构,所以我不能只使用

    for (int i; i<[arr count]; i++) {
        Class obj = [arr objectAtIndex:i];

        if([obj isKindOfClass: [Class class]]) {
            //do sth
        }
    }
Run Code Online (Sandbox Code Playgroud)

所以,我需要检查obj变量是否是一个Class类型,我想它会直接进入C,但我该怎么做呢?

如果答案还提供了一种方法来检查数组中NSObject的项是否为a ,如示例代码中的项目,那么这将是一个加号,NSPredicate也将true用于NSObject检查

Joe*_*Joe 47

要确定"对象"是一个类还是一个实例,您需要检查它是否是两阶段过程中的元类.首先调用object_getClass然后检查它是否是使用的元类class_isMetaClass.你需要#import <objc/runtime.h>.

NSObject *object = [[NSObject alloc] init];
Class class = [NSObject class];

BOOL yup = class_isMetaClass(object_getClass(class));
BOOL nope = class_isMetaClass(object_getClass(object));
Run Code Online (Sandbox Code Playgroud)

二者Class*id具有相同的结构布局(Class isa),因此可以构成为对象,并且可以既接收消息使得难以确定哪个是哪个.这似乎是我能够获得一致结果的唯一方式.

编辑:

以下是检查的原始示例:

NSMutableArray *arr = [[NSMutableArray alloc] init];

[arr addObject:[NSObject class]];
[arr addObject:[NSValue class]];
[arr addObject:[NSNumber class]];
[arr addObject:[NSPredicate class]];
[arr addObject:@"not a class object"];

for (int i; i<[arr count]; i++) {
    id obj = [arr objectAtIndex:i];

    if(class_isMetaClass(object_getClass(obj)))
    {
        //do sth
        NSLog(@"Class: %@", obj);
    }
    else
    {
        NSLog(@"Instance: %@", obj);
    }
}

[arr release];
Run Code Online (Sandbox Code Playgroud)

并输出:

类:NSObject
类:NSValue
类:NSNumber
类:NSPredicate
实例:不是类对象

  • +1并且Bool变量具有指导性的名称! (2认同)

use*_*008 8

更新:在iOS 8+或OS X 10.10+中,您可以执行以下操作:

object_isClass(obj)
Run Code Online (Sandbox Code Playgroud)

(你需要#import <objc/runtime.h>.)


Dou*_*ill 5

乔的回答很好.在大多数情况下有效的简单替代方法是检查对象是否返回自身以响应class.

if ([obj class] == obj) { … }
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为NSObject元类会覆盖class并返回类对象(本身) - 请参阅NSObject类参考.这不需要运行时标头,但假定对象是子类,NSObject并且不会覆盖-class+class执行异常操作.


根据问题中的输入,结果与Joe的结果相同:

NSMutableArray *arr = [[NSMutableArray alloc] init];

[arr addObject:[NSObject class]];
[arr addObject:[NSValue class]];
[arr addObject:[NSNumber class]];
[arr addObject:[NSPredicate class]];
[arr addObject:@"not a class object"];

for (id<NSObject> obj in arr) {

    if ([obj class] == obj) {
        NSLog(@"Class: %@", obj);
    }
    else {
        NSLog(@"Instance: %@", obj);
    }
}
Run Code Online (Sandbox Code Playgroud)

类:NSObject
类:NSValue
类:NSNumber
类:NSPredicate
实例:不是类对象