iOS Runtime

iOS-isa走位面试题

2020-09-15  本文已影响0人  我要当个程序员

准备

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,这里的isKindOfClassisMemberOfClass是一个类方法
第二步
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,这里的isKindOfClassisMemberOfClass是一个实例方法
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
上一篇下一篇

猜你喜欢

热点阅读