您的位置:首页 > 移动开发 > IOS开发

iOS Runtime

2016-01-12 18:41 417 查看
Object-c Runtime

    今日突然想起以前被问过有关runtime的问题,那时候只知道是运行时状态,其他一概不知。偶然看到一篇以题目为切入点的博文,感觉豁然开朗了许多(其实我是看了几乎一个下午)。

    博客地址:http://chun.tips/blog/2014/11/08/bao-gen-wen-di-objective%5Bnil%5Dc-runtime(4)%5Bnil%5D-cheng-yuan-bian-liang-yu-shu-xing/

    下面说说我自己的理解:

    第一题:

    @implementation Son : Father

    - (id)init

    {

     self = [super init];

        if (self)

        {

         NSLog(@"%@", NSStringFromClass([self class]));

         NSLog(@"%@", NSStringFromClass([super class]));

        }

     return self;

    }

    @end

    输出都是Son类

    解释如下:当我们调用[self alloc]时,因为Son与父类都没有该方法,所以最后会找到主父类NSObject,告诉编译器为Son分配地址并初始化,(这里我看到一句很有启发的话,那就是super只是告诉编译器往父类中找),

,然后Son中没有class方法,所以最后还是在NSObject中找到,

-(Class)class{

    return object_getClass(self);

}

    因此[self class]就是调用object_msgSend,最后返回self类名即是Son,而[super class]就是调用的object_msgSendSuper,所以返回的也是self本身的类名。

    第二题:

@interface Sark : NSObject

 @end

    @implementation Sark

@end

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        BOOL res1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];

        BOOL res2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];

        BOOL res3 = [(id)[Sark class] isKindOfClass:[Sark class]];

        BOOL res4 = [(id)[Sark class] isMemberOfClass:[Sark class]];

        NSLog(@"%d %d %d %d", res1, res2, res3, res4);

    }

    return 0;

}

    输出:yes,no,no,no

 - (BOOL)isKindOf:aClass

{

    Class cls;

    for (cls = isa; cls; cls = cls->superclass) 

        if (cls == (Class)aClass)

            return YES;

    return NO;

}

- (BOOL)isMemberOf:aClass

{

    return isa == (Class)aClass;

}

NSObjetc的isa是指向Meta class of Object,而Meta class of Object的isa是指向自己的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: