[objective-c] Objective-C에서 어떤 클래스의 객체를 테스트합니까?

Objective-C에서 객체가 특정 클래스의 인스턴스인지 어떻게 테스트합니까? 객체 a가 클래스 b 또는 클래스 c의 인스턴스인지 확인하고 싶습니다. 어떻게 수행합니까?



답변

객체가 클래스 a의 인스턴스인지 테스트하려면 :

[yourObject isKindOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of 
// given class or an instance of any class that inherits from that class.

또는

[yourObject isMemberOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of a 
// given class.

객체의 클래스 이름을 얻으려면 NSStringFromClass함수 를 사용할 수 있습니다 .

NSString *className = NSStringFromClass([yourObject class]);

objective-c 런타임 API의 c-function :

#import <objc/runtime.h>

/* ... */

const char* className = class_getName([yourObject class]);
NSLog(@"yourObject is a: %s", className);

편집 : 스위프트에서

if touch.view is UIPickerView {
    // touch.view is of type UIPickerView
}


답변

당신은 또한 사용할 수 있습니다

NSString *className = [[myObject class] description]; 

모든 NSObject에서


답변

Apple 문서에서 isKindOfClass의 의미

클래스 클러스터로 표시되는 객체에서이 방법을 사용할 때는주의하십시오. 클래스 클러스터의 특성으로 인해 다시 얻는 객체가 항상 예상 한 유형이 아닐 수도 있습니다. 클래스 클러스터를 반환하는 메서드를 호출하면 메서드에서 반환 한 정확한 형식이 해당 개체로 수행 할 수있는 작업을 나타내는 가장 좋은 지표입니다. 예를 들어, 메소드가 NSArray 객체에 대한 포인터를 반환하는 경우 다음 코드와 같이이 메소드를 사용하여 배열이 변경 가능한지 확인하지 않아야합니다.

// DO NOT DO THIS!
if ([myArray isKindOfClass:[NSMutableArray class]])
{
    // Modify the object
}

코드에서 이러한 구문을 사용하는 경우 실제로 수정해서는 안되는 객체를 수정하는 것이 좋습니다. 그러면 객체가 변경되지 않은 다른 코드에 문제가 발생할 수 있습니다.


답변

특정 수업을 확인하려면 다음을 사용할 수 있습니다

if([MyClass class] == [myClassObj class]) {
//your object is instance of MyClass
}


답변

클래스의 이름을 얻으려면 다음을 호출하십시오.

id yourObject= [AnotherClass returningObject];

NSString *className=[yourObject className];

NSLog(@"Class name is : %@",className);


답변

런타임을 확인할 수도 있습니다. 코드와 내부 (lldb) 콘솔 쓰기에 하나의 중단 점을 두십시오.

(lldb) po [yourObject class]

이렇게 ..

여기에 이미지 설명을 입력하십시오


답변