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
NSObject 类分析(未完成)
时间: 2024-10-18 02:10:14