isMemberOfClassとisKindOfClassの区分

1903 ワード

この2つの方法はよく私たちを困惑させますが、どんな違いがありますか?
定義#テイギ#
isKindOfClass:このクラスまたはこのクラスのサブクラスであるか否かを判断する例
isMemberOfClass:このクラスのインスタンスかどうかを判断する
使用
使用については、ネット上でイメージ的な例を見て、ここで直接使ってみました.NSObjectに引き継がれたPerson,PersonのTeacherの2つのクラスがある
#import      
    
@interface Person : NSObject    
{    
    NSString *name;    
}    
-(void)setName:(NSString*)n;    
    
@end    
  
   
#import "Person.h"     
    
@implementation Person    
-(void)setName:(NSString *)n    
{    
    name = n;    
}    
    
@end    
#import "Person.h"     
    
@interface Teacher : Person    
    
-(void)teach;    
    
@end    
   
#import "Teacher.h"     
    
@implementation Teacher    
-(void)teach    
{    
    NSLog(@"    ");    
}    
@end    

isKindOfClassを使用する例:
Person *person = [[Person alloc] init];    
Teacher *teacher = [[Teacher alloc] init];    
    
//YES     
if ([teacher isKindOfClass:[Teacher class]]) {    
    NSLog(@"teacher   Teacher  Teacher   ");    
}    
//YES     
if ([teacher isKindOfClass:[Person class]]) {    
    NSLog(@"teacher   Person  Person   ");    
}    
//YES     
if ([teacher isKindOfClass:[NSObject class]]) {    
    NSLog(@"teacher   NSObject  NSObject   ");    
}    

isMemberOfClassを使用する例:
   Person *person = [[Person alloc] init];    
   Teacher *teacher = [[Teacher alloc] init];    
       
   //YES     
   if ([teacher isMemberOfClass:[Teacher class]]) {    
        NSLog(@"teacher Teacher    ");    
   }    
   //NO     
   if ([teacher isMemberOfClass:[Person class]]) {    
       NSLog(@"teacher Person    ");    
   }    
   //NO     
   if ([teacher isMemberOfClass:[NSObject class]]) {    
       NSLog(@"teacher NSObject    ");    
   }