首页 > 代码库 > NSObject 类分析(未完成)

NSObject 类分析(未完成)

NSObject 类分析(未完成)

转载请注名出处 http://blog.csdn.net/uxyheaven

iOS 的 NSObject 类没有开源, 但是呢 runtime开源了,里面有个类 Object 看接口和NSObject差不多,下面我就对着 Object 的代码来分析下 NSObject

runtime代码在http://opensource.apple.com/tarballs/objc4/objc4-493.9.tar.gz下载,Object在<Object.h>, 这里的文件夹写着Obsolete, 呃.

属性

isa

是一个指向Class的指针,具体请看这篇文章Objective-C objc_class 介绍

方法

class

实例方法返回的是isa指针, 类方法返回的是本身

代码实现如下:

- class
{
    return (id)isa; 
}

+ class 
{
    return self;
}
superclass

返回父类

代码实现如下:

+ superclass 
{ 
    return class_getSuperclass((Class)self); 
}

- superclass 
{ 
    return class_getSuperclass(isa); 
}

调用的是runtime中的class_getSuperclass方法, 跟踪到最后实例方法返回的是isa->superclass,类方法返回的是self->superclass

static class_t *
getSuperclass(class_t *cls)
{
    if (!cls) return NULL;
    return cls->superclass;
}
- (BOOL)isMemberOf:aClass
- (BOOL)isMemberOf:aClass
{
    return isa == (Class)aClass;
}

看代码可以得知是通过比较实例对象的isa是否和 传过来的[类 Class] 一样来判断的.而实例对象的isa确实就是指着实例对象的类的.

- (BOOL)isKindOf:aClass
- (BOOL)isKindOf:aClass
{
    register Class cls;
    for (cls = isa; cls; cls = class_getSuperclass(cls)) 
        if (cls == (Class)aClass)
            return YES;
    return NO;
}

// class_getSuperclass 展开后如下
static class_t *
getSuperclass(class_t *cls)
{
    if (!cls) return NULL;
    return cls->superclass;
}

代码思路也很好理解,如果自己的isa等于aClass(aClass的父类,此处循环)就返回YES,否则返回NO