準備
下題分別輸出什么
BOOL re1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];
BOOL re2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];
BOOL re3 = [(id)[LGPerson class] isKindOfClass:[LGPerson class]];
BOOL re4 = [(id)[LGPerson class] isMemberOfClass:[LGPerson class]];
NSLog(@" re1 :%hhd\n re2 :%hhd\n re3 :%hhd\n re4 :%hhd\n",re1,re2,re3,re4);
BOOL re5 = [(id)[NSObject alloc] isKindOfClass:[NSObject class]];
BOOL re6 = [(id)[NSObject alloc] isMemberOfClass:[NSObject class]];
BOOL re7 = [(id)[LGPerson alloc] isKindOfClass:[LGPerson class]];
BOOL re8 = [(id)[LGPerson alloc] isMemberOfClass:[LGPerson class]];
NSLog(@" re5 :%hhd\n re6 :%hhd\n re7 :%hhd\n re8 :%hhd\n",re5,re6,re7,re8);
第一步
通過題目可得re1察绷,re2,re3,re4,這里的isKindOfClass
和isMemberOfClass
是一個類方法
第二步
isKindOfClass
類方法的代碼是:
+ (BOOL)isKindOfClass:(Class)cls {
//for (int i = 0;i<2;i++){我們第一次進來的i=0}
for (Class tcls = self->ISA(); tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
第三步
分析 re1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];
//源代碼里的定義
typedef struct objc_object *id;
+ (Class)class {
return self;
}
(id)[NSObject class] ->id(NSObject)->NSObject
[NSObject class] ->NSObject
re1 = [NSObject isKindOfClass:NSObject];
帶入我們第二步isKindOfClass
類方法里面
第一次循環(huán)
if (NSObject的isa == NSObject) return YES;
配合isa
走位圖最終返回re1 = 1爷狈,同理可得re3 = 0。
第四步
isMemberOfClass
類方法的代碼是:
+ (BOOL)isMemberOfClass:(Class)cls {
return self->ISA() == cls;
}
re2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];
=>
re2 = [NSObject isMemberOfClass:NSObject];
在結合isa
走位圖得到re2 = 0谓媒,同理可得re4 = 0淆院。
最后得到的答案就是
re1 :1
re2 :0
re3 :0
re4 :0
第五步
通過題目可得re5,re6句惯,re7土辩,re8,這里的isKindOfClass
和isMemberOfClass
是一個實例方法
isKindOfClass
實例方法的代碼是:
- (BOOL)isKindOfClass:(Class)cls {
//for (int i = 0;i<2;i++){我們第一次進來的i=0}
for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
//理解這里循環(huán)第一次進來的數值很重要
//第一次進來的 tcls = [self class];后面進來的才是 tcls->superclass
if (tcls == cls) return YES;
}
return NO;
}
分析
re5 = [(id)[NSObject alloc] isKindOfClass:[NSObject class]];
[NSObject alloc]->NSObject Intance
[NSObject class]->NSObject
第一次循環(huán)
if (([NSObject Intance]的class=》NSObject) == NSObject) return YES;
}
再配合和isa
的走位圖最終得到的re5=1抢野,同理可得re7=1
第六步
isMemberOfClass
實例方法的代碼是
- (BOOL)isMemberOfClass:(Class)cls {
return [self class] == cls;
}
分析 re6 = [(id)[NSObject alloc] isMemberOfClass:[NSObject class]];
=》
re6 = [(id)[NSObject alloc] isMemberOfClass:[NSObject class]];
return ([NSObject Intance]的class=》NSObject) == NSObject;
再配合和isa的走位圖最終得到的re6=1拷淘,同理可得re8=1
最終得到
re5 :1
re6 :1
re7 :1
re8 :1