iOS-isa走位面试题
准备
isa流程图.png下题分别输出什么
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
类方法里面
第一次循环
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) {
//理解这里循环第一次进来的数值很重要
//第一次进来的 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
第一次循环
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