isKindOfClass, isMemberOfClass的區別

這兩個方法常常會困惑我們,它們有什麼區別呢?

定義

首先,我們來看看它們的定義。

isKindOfClass:

官方解釋: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.

isMemberOfClass:

官方解釋:Returns a Boolean value that indicates whether the receiver is an instance of a given class.

使用

關於使用,在網上看到一個很形象的例子,這裏就直接拿來用了。

這裏有兩個類,分別是繼承於NSObject的Person,Person的Teacher

#import <Foundation/Foundation.h>   
  
@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的例子:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
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的子類");  
}  
[person release];  
[teacher release];  
[pool release];  


輸出結果:

2012-07-04 14:34:17.315 ObjectiveCTest[2595:f803] teacher 是 Teacher類或Teacher的子類

2012-07-04 14:34:17.316 ObjectiveCTest[2595:f803] teacher 是 Person類或Person的子類

2012-07-04 14:34:17.316 ObjectiveCTest[2595:f803] teacher 是 NSObject類或NSObject的子類


使用isMemberOfClass的例子:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
   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類的成員");  
   }  
   [person release];  
   [teacher release];  
   [pool release];  

輸出結果:

2012-07-04 14:23:07.965 ObjectiveCTest[2460:f803] teacher Teacher類的成員

看了這兩個例子,應該就會明白了。

發佈了84 篇原創文章 · 獲贊 121 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章