阅读 75

iOS小知识之对象的本质

每天一个小知识,稳步前进不用愁。 使用clang还原Objective-C代码在底层的实现,来探索对象的本质是什么! 打开main.m函数,写入如下代码:

#import <Foundation/Foundation.h>
#import <objc/runtime.h> 
@interface LGPerson : NSObject 
@property (nonatomic, strong) NSString *Name;
@end
@implementation LGPerson 
@end 
int main(int argc, const char * argv[]) { 
    @autoreleasepool {
        NSLog(@"Hello, World!"); 
    } 
    return 0; 
}复制代码

使用clang命令,生成main.cpp文件

clang -rewrite-objc main.m -o main.cpp复制代码

通过分析cpp文件,来探索对象的本质 找到LGPerson的定义与实现,可以发现

typedef struct objc_object LGPerson;

struct LGPerson_IMPL { 
    struct NSObject_IMPL NSObject_IVARS;
    NSString *_Name; 
};复制代码
  • LGPerson定义为objc_object类型

  • LGPerson_IMPLLGPerson的底层实现

  • LGPerson_IMPL中嵌套NSObject_IMPL结构体

  • 结构体嵌套相当于伪继承

找到NSObject的定义与实现,可以发现

typedef struct objc_object NSObject; 

struct NSObject_IMPL { 
    Class isa;
};复制代码
  • NSObject定义为objc_object类型

  • NSObject_IMPLNSObject的底层实现

  • 只有一个Class类型的成员变量isa

找到Class的定义与实现,可以发现

typedef struct objc_class *Class;

struct objc_class { 
    Class _Nonnull isa __attribute__((deprecated)); 
} __attribute__((unavailable));复制代码
  • Class类型,本质是objc_class结构体指针,占8字节

找到objc_object的实现,可以发现

struct objc_object { 
    Class _Nonnull isa __attribute__((deprecated));
};复制代码
  • objc_object只有一个Class类型的成员变量isa

  • 所有对象的底层实现,本质上都来自于objc_object结构体


结论:

  • 对象的本质是结构体

  • 类也是对象,本质同样是结构体

  • 万物皆对象,万物皆有isa

  • isa本质是结构体指针,占8字节

  • 所有对象的底层实现,本质上都来自于objc_object结构体


作者:叶秋主
链接:https://juejin.cn/post/7018346390036152350


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐