前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OC源码剖析对象的本质

OC源码剖析对象的本质

原创
作者头像
艳艳代码杂货店
修改2021-09-26 09:39:21
3340
修改2021-09-26 09:39:21
举报
文章被收录于专栏:艳艳代码杂货店

类的底层实现

先写一个 Person 类:

@interface Person : NSObject

@property (nonatomic, copy) NSString *p_name;

@property (nonatomic, assign) int p_age;

- (void)p_instanceMethod1;

@end

@implementation Person

- (void)p_instanceMethod1{

NSLog(@"%s",__func__);

}

@end

使用 clang 编译器, clang -rewrite-objc Person.m -o Person.cpp  将 Person.m  编译成 Person.cpp 文件,部分代码如下:

/// 1: Person 类型的底层结构

struct NSObject_IMPL {

Class isa;

};

struct Person_IMPL {

struct NSObject_IMPL NSObject_IVARS;

int _p_age;

NSString * _Nonnull _p_name;

};

/// 2: p_name 属性的底层结构

// get

static NSString * _Nonnull _I_Person_p_name(Person * self, SEL _cmd) { return (*(NSString * _Nonnull *)((char *)self + OBJC_IVAR_$_Person$_p_name)); }

extern "C" __declspec(dllimport) void objc_setProperty (id, SEL, long, id, bool, bool);

// set

static void _I_Person_setP_name_(Person * self, SEL _cmd, NSString * _Nonnull p_name) { objc_setProperty (self, _cmd, __OFFSETOFIVAR__(struct Person, _p_name), (id)p_name, 0, 1); }

/// 3: p_age 类型的底层结构

// get

static int _I_Person_p_age(Person * self, SEL _cmd) { return (*(int *)((char *)self + OBJC_IVAR_$_Person$_p_age)); }

// set

static void _I_Person_setP_age_(Person * self, SEL _cmd, int p_age) { (*(int *)((char *)self + OBJC_IVAR_$_Person$_p_age)) = p_age; }

/// 4: p_instanceMethod1 方法的底层结构

static void _I_Person_p_instanceMethod1(Person * self, SEL _cmd) {

NSLog((NSString *)&__NSConstantStringImpl__var_folders_86_0y_j3bzj65z6vw6hy1chw_4m0000gp_T_Person_f010c0_mi_0,__func__);

}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 类的底层实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档