iOS中类的本质及其存储

2018-08-14  本文已影响0人  皆为序幕_

类对象

看个例子

@interface Person : NSObject
@property (nonatomic,strong) NSString *name;
-(void)test;
+(void)run;
@end

@implementation Person
-(void)test{
    NSLog(@"test");
}
+(void)run{
    NSLog(@"run");
}
@end
--------------------------------------
@interface Student : Person
-(void)eat;
@end

@implementation Student
-(void)eat{
    NSLog(@"eat");
}
@end
--------------------------------------
int main(int argc, const char * argv[]) {

    Person *p = [[Person alloc]init];
    [p setName:@"ABC"];
    [Person run];
    [p test];

    Student *stu = [[Student alloc]init];
    [stu eat];

    return 0;
}
  1. 当程序启动时,Person类会被加载到代码区
  2. 当程序中用到Person时,就会在堆中创建一个Person类的类对象
  3. Person类对象又是由Person元类对象创建,Person元类对象又是由根元类对象创建,根元类对象指向它自己
  4. 当程序执行 [[Person alloc]init]时,在堆中创建一个Person类的实例对象
  5. 实例对象isa–>类对象isa–>元类对象isa–>根元类对象isa–>根元类对象自己
  6. Person类对象中保持了它所有属性对象方法
  7. Person元类对象中保持了它所有的类方法
    类的本质及其存储

当程序调用

Person *p = [[Person alloc]init];
[p setName:@"ABC"];
[p test];

调用对象方法顺序:
p对象–>Person实例对象isa–>Person类对象的方法列表里找对应的方法


调用对象方法顺序

当程序调用

 [Person run];

调用类方法顺序:
Person–>Person类对象isa–>Person元类对象的方法列表里找对应的方法


调用类方法顺序

类继承体系

类继承体系

判断类对象

上一篇 下一篇

猜你喜欢

热点阅读