isKindOfClass와 isMemberOfClass의 iOS 차이점


152

사이의 차이는 무엇입니까 isKindOfClass:(Class)aClass와는isMemberOfClass:(Class)aClass기능 ? 나는 그것이 작은 것과 같은 것을 알고 있습니다. 하나는 전역 적이며 다른 하나는 정확한 클래스 일치이지만 어느 것을 기쁘게 할 사람을 지정해야합니다.

스위프트 isKind(of aClass: AnyClass)isMember(of aClass: AnyClass).

답변:


264

isKindOfClass:YES수신자 지정된 클래스 의 인스턴스 이거나 상속 하는 모든 클래스의 인스턴스 인 경우 반환 에서 된 .

isMemberOfClass:YES수신자 지정된 클래스 의 인스턴스 인 경우 에만를 리턴 합니다 .

대부분의 경우 isKindOfClass:코드가 서브 클래스에서도 작동 하도록 하기 위해 사용하려고합니다 .

NSObject의 프로토콜 참조 이러한 방법에 대해 좀 더 이야기.


아래 의심을 지우시겠습니까? if ([lbl.textColor isMemberOfClass : [UIColor class]]) {// Not Memeber NSLog (@ "Not Memeber"); } else {NSLog (@ "Not Memeber"); } if ([imgView.image isMemberOfClass : [UIImage 클래스]]) {// Memeber NSLog (@ "Memeber"); } else {NSLog (@ "Not Memeber"); }
Nikkie

82
  • isKindOfClass:주어진 클래스에서 객체가 상속 되는지 여부를 나타냅니다.
  • isMemberOfClass:객체 주어진 클래스 의 인스턴스 인지 여부를 나타냅니다 .

[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO

@ Durga, 이것이 당신의 질문에 대답하면, 당신은 그것을 받아 들여야합니다. 요금 수락에 대한 자세한 내용은 다음을 참조
meta.stackexchange.com/questions/16721/…

1
객체가 지정된 클래스의 인스턴스 인 경우 isKindOfClass도 YES를 반환합니다. 즉, isMemberOfClass는 isKindOfClass의 서브 세트입니다.
스쿠터

48

가정

@interface A : NSObject 
@end

@interface B : A
@end

...

id b = [[B alloc] init];

그때

[b isKindOfClass:[A class]] == YES;
[b isMemberOfClass:[A class]] == NO;

기본적으로 -isMemberOfClass:인스턴스가 지정된 클래스의 클래스 인 -isKindOfClass:경우 true이고, 인스턴스가 지정된 클래스의 클래스이거나 인스턴스의 조상 중 하나가 지정된 클래스의 경우 true입니다.

-isMemberOfClass: 거의 사용되지 않습니다.


1
그러나 UIView와 UISegmentedControl을 포함하는 하위 뷰 배열이 있고 루프를 반복하고 클래스에 조건을 설정하는 경우 isMemberOfClas UIView와 isMemberOfClass UISegmentedControl을 사용하여 구별해야합니다. isKindOfClass는 UISegmentedControl을 UIView로 볼 수 있습니다.
PruitIgoe

@Pruitlgoe는 매우 사실입니다. 처리하는 모든 객체가 UIView인지 확인하기 위해 isKindOfClass : [UIView 클래스]를 사용할 수 있지만, 고유 한 구현을 나타내려면 일부 조건문에서 isMemberOfClass : [UIView 클래스] 및 / 또는 isMemberOfClass : [UISegmentedControl 클래스]를 사용해야합니다. 인스턴스 클래스를 기반으로 한 견해
NoodleOfDeath

9

isKindOfClass : 수신자가 지정된 클래스의 인스턴스인지 또는 해당 클래스에서 상속 된 클래스의 인스턴스인지를 나타내는 부울 값을 리턴합니다.

isMemberOfClass : 수신자가 주어진 클래스의 인스턴스인지를 나타내는 부울 값을 리턴합니다.


2

isKindOfClass-> 객체가 해당 클래스의 인스턴스 또는 상속 된 클래스의 인스턴스 인 경우 YES를 반환합니다.

isMemberOfClass : 객체가 해당 클래스의 인스턴스이면 YES를 반환하지만 다음과 같은 경우에는 No를 반환합니다.

예는 jtbandes 답변에서 충분합니다.


0

클래스 클러스터 때문에 isMemberOfClass는 예상치 못한 답변을 제공 할 수 있습니다. 대부분의 경우 최선의 선택은-(BOOL) conformsToProtocol : (SEL) aSelector 또는-(BOOL) conformsToProtocol : (Protocol *) aProtocol 일 가능성이 높습니다. 즉, 클래스 / 서브 클래스를 테스트하는 것보다 사용자의 요구에 응답 할 수 있으면이를 테스트하는 것이 좋습니다.

NSObject 클래스 및 프로토콜에 대해서는 apple doc을 참조하십시오.

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/cl/NSObject

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intf/NSObject

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.