objective c - 클래스 - Class 유형인지 확인하십시오.




objective c 상속 (4)

"객체"가 클래스 또는 인스턴스인지 확인하려면 2 단계 프로세스에서 메타 클래스 인지 확인해야합니다. 먼저 object_getClass 를 호출하고 object_getClass 를 사용하는 메타 클래스인지 확인합니다. #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));

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];

그리고 출력 :

클래스 : NSObject
클래스 : NSValue
클래스 : NSNumber
클래스 : NSPredicate
인스턴스 : 클래스 객체가 아닙니다.

나는 Class 객체의 NSArray 를받는 메소드를 가지고 있고 그것들 모두가 코드 벨로우즈로 생성 된 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"];

문제는 Class 가 객관적인 Class 가 아니라 클래스라는 것입니다.

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

        if([obj isKindOfClass: [Class class]]) {
            //do sth
        }
    }

그래서, obj 변수가 Class 타입인지 확인해야하는데, C 타입 일 것이라고 가정합니다. 어떻게 할 수 있습니까?

배열의 항목이 NSObject , 예제 코드의 항목인지, NSPredicateNSObject 검사에 대해 true 인지 여부를 확인하는 방법을 제공하는 경우 플러스가됩니다.


배열의 객체가 Class 객체인지 확인해야하는 경우 클래스 메소드에 응답하는지 확인할 수 있습니다.

for ( id obj in arr ) {
    if (([obj respondsToSelector:@selector(isSubclassOfClass:)])
          && (obj == [NSObject class]) ) {
        NSLog(@"%@", obj);
    }
}

isSubclassOfClass: 응답하는지 확인하여 Class 객체라는 것을 알게되면 [NSObject class] 와의 직접적인 일치를 검사 할 수 있습니다.


여기에 아무런 문제가 없습니다.

if([NSStringFromClass([obj class]) isEqualToString:@"Class"]){
    NSLog(@"It is type of Class");
}

편집하다

또는 클래스를 프로토콜에 따르도록 할 수 있습니다. 배열에서 가져온 obj가 다음과 같이이 프로토콜을 준수하는지 확인하십시오.

if([obj conformsToProtocol:@protocol(MyClassProtocol)])

편집하다

또는 배열에서 가져온 것이 NSObject와 유사한 지 검사 할 수 있습니다.

if ([object conformsToProtocol:@protocol(NSObject)]) {
    // Do something
}

조의 대답은 좋다. 대부분의 상황에서 작동하는 간단한 대안은 객체가 class 에 응답하여 스스로를 반환하는지 확인하는 것입니다.

if ([obj class] == obj) { … }

이는 NSObject 메타 클래스가 클래스를 오버라이드하고 클래스 객체 (자체)를 반환하기 때문에 가능합니다. NSObject 클래스 참조를 참조하십시오 . 이것은 런타임 헤더를 필요로하지 않지만 객체가 NSObject 서브 +class 이고 -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);
    }
}

클래스 : NSObject
클래스 : NSValue
클래스 : NSNumber
클래스 : NSPredicate
인스턴스 : 클래스 객체가 아닙니다.





type-conversion