本文所运行的环境是自己编译好的:配置运行objc4-750和使用
本文所写的项目详见:OCBasicDemo
我们从前面的2节,应该大致对isa、superclass应该有了大致的了解了.
下面是我从网络摘的图:
- 分析:
- 1.instance(实例对象)的isa指向class(类对象)
- 2.class(类对象)的isa指向meta-claaa(元类对象)
- 3.meta-class(元类)的isa指向基类的meta-class
- 4.class(类对象)的superclass指向父类的class(类对象)
- 如果没有父类superclass指向nil
- 5.meta-class(元类)的superclass指向的是父类的meta-class
- 6.基类的meta-class的superclass指向基类的class
- 7.instance(实例对象)调用对象的方法:isa找class(类对象),不存在,则通过superclass去找
- 8.class(类对象)调用类方法:isa找meta-class(元类),不存在,则通过superclass去找
示例:
#import <Foundation/Foundation.h>
@interface NSObject()
+ (void)test;
@end
@implementation NSObject (Test)
- (void)test
{
NSLog(@"test被调用啦%p", self);
}
@end
@interface Person : NSObject
+ (void)test;
@end
@implementation Person
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"%p", [NSObject class]);//0x100b14140
NSLog(@"%p", [Person class]); //0x1000011c0
[NSObject test];//test被调用啦0x100b14140
[Person test];//test被调用啦0x1000011c0
}
return 0;
}
分析:
- 1.调用:[NSObject test];我们定义了+ test方法,但是在实现里面没有实现该方法,所以就相当于在元类里面没有找到,此时就会通过superclass指针来找,就去NSObject的class类里面找了,发现里面实现了test方法,执行(-test)
- 2.对于[Person test];也是类似哟
友情链接: