這兩個方法常常會困惑我們,它們有什麼區別呢?
定義
首先,我們來看看它們的定義。
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類的成員
看了這兩個例子,應該就會明白了。