前言: iOS 高级之美 是本人总结了一些工作实际开发研究以及面试重点,围绕底层进行 源码分析
- LLDB 调试
- 源码断点
- 汇编调试
,让读者真正感受 Runtime底层之美~😊
目录如下:
iOS 高级之美(一)—— iOS_objc4-756.2 最新源码编译调试
iOS 高级之美(二)—— OC对象底层上篇
iOS 高级之美(三)—— OC对象底层下篇
iOS 高级之美(四)—— isa原理分析
iOS 高级之美(五)—— 类结构分析上篇
iOS 高级之美(六)—— malloc分析
iOS 高级之美(七)—— 24K纯技术男~KC_2019年终总结
iOS 高级之美(八)—— 类结构分析中篇
iOS 高级之美(九)—— 类结构分析下篇

一、isa的初始化
上一篇,我们在探索对象的初始化的时候一个非常重要的点就是:经过 calloc
申请的内存,但是这个指针怎么就和LGPerson
这个类所关联的呢? 下面就可以直接定位到:obj->initInstanceIsa(cls, hasCxxDtor);
- 我们知道了
obj
在上面只有一个指针
- 下面那段代码就可以分析
对象与类直接的联系
initIsa(cls, true, hasCxxDtor)
inline void
objc_object::initIsa(Class cls, bool nonpointer, bool hasCxxDtor)
{
assert(!isTaggedPointer());
if (!nonpointer) {
isa.cls = cls;
} else {
assert(!DisableNonpointerIsa);
assert(!cls->instancesRequireRawIsa());
isa_t newisa(0);
#if SUPPORT_INDEXED_ISA
assert(cls->classArrayIndex() > 0);
newisa.bits = ISA_INDEX_MAGIC_VALUE;
// isa.magic is part of ISA_MAGIC_VALUE
// isa.nonpointer is part of ISA_MAGIC_VALUE
newisa.has_cxx_dtor = hasCxxDtor;
newisa.indexcls = (uintptr_t)cls->classArrayIndex();
#else
newisa.bits = ISA_MAGIC_VALUE;
// isa.magic is part of ISA_MAGIC_VALUE
// isa.nonpointer is part of ISA_MAGIC_VALUE
newisa.has_cxx_dtor = hasCxxDtor;
newisa.shiftcls = (uintptr_t)cls >> 3;
#endif
// This write must be performed in a single store in some cases
// (for example when realizing a class because other threads
// may simultaneously try to use the class).
// fixme use atomics here to guarantee single-store and to
// guarantee memory order w.r.t. the class index table
// ...but not too atomic because we don't want to hurt instantiation
isa = newisa;
}
}
- 上面第一层判断是
isTaggedPointer
的断言,我会在后续文章重点分析
- 接下来是
nonpointer
的判断,因为 nonpointer
优化,适合普通结构不一样的!内存优化的 isa_t
结构
union isa_t {
isa_t() { }
isa_t(uintptr_t value) : bits(value) { }
Class cls;
uintptr_t bits;
#if defined(ISA_BITFIELD)
struct {
ISA_BITFIELD; // defined in isa.h
};
#endif
};
- 这里采用的是联合体&位域的搭配
- 一个
8字节指针
在 64位
下 其实可以存储很多内容,我们可以优化内存,在不同的位上,放不同的东西!
Struct
与 Union
主要有以下区别:
- 1.
struct
和 union
都是由多个不同的数据类型成员组成, 但在任何同一时刻, union
中只存放了一个被选中的成员, 而struct
的所有成员都存在。在 struct
中,各成员都占有自己的内存空间,它们是同时存在的。一个struct
变量的总长度等于所有成员长度之和。在Union
中,所有成员不能同时占用它的内存空间,它们不能同时存在。Union
变量的长度等于最长的成员的长度。
- 2. 对于
union
的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于struct
的不同成员赋值是互不影响的。
- 我们在看一下
isa 位域
情况 ( x86_64 架构)
# elif __x86_64__
# define ISA_MASK 0x00007ffffffffff8ULL
# define ISA_MAGIC_MASK 0x001f800000000001ULL
# define ISA_MAGIC_VALUE 0x001d800000000001ULL
# define ISA_BITFIELD \
uintptr_t nonpointer : 1; \
uintptr_t has_assoc : 1; \
uintptr_t has_cxx_dtor : 1; \
uintptr_t shiftcls : 44; /*MACH_VM_MAX_ADDRESS 0x7fffffe00000*/ \
uintptr_t magic : 6; \
uintptr_t weakly_referenced : 1; \
uintptr_t deallocating : 1; \
uintptr_t has_sidetable_rc : 1; \
uintptr_t extra_rc : 8
# define RC_ONE (1ULL<<56)
# define RC_HALF (1ULL<<7)
nonpointer
:表示是否对 isa 指针
开启指针优化
前言: iOS 高级之美 是本人总结了一些工作实际开发研究以及面试重点,围绕底层进行 源码分析
- LLDB 调试
- 源码断点
- 汇编调试
,让读者真正感受 Runtime底层之美~😊
目录如下:
iOS 高级之美(一)—— iOS_objc4-756.2 最新源码编译调试
iOS 高级之美(二)—— OC对象底层上篇
iOS 高级之美(三)—— OC对象底层下篇
iOS 高级之美(四)—— isa原理分析
iOS 高级之美(五)—— 类结构分析上篇
iOS 高级之美(六)—— malloc分析
iOS 高级之美(七)—— 24K纯技术男~KC_2019年终总结
iOS 高级之美(八)—— 类结构分析中篇
iOS 高级之美(九)—— 类结构分析下篇

一、isa的初始化
上一篇,我们在探索对象的初始化的时候一个非常重要的点就是:经过 calloc
申请的内存,但是这个指针怎么就和LGPerson
这个类所关联的呢? 下面就可以直接定位到:obj->initInstanceIsa(cls, hasCxxDtor);
- 我们知道了
obj
在上面只有一个指针
- 下面那段代码就可以分析
对象与类直接的联系
initIsa(cls, true, hasCxxDtor)
inline void
objc_object::initIsa(Class cls, bool nonpointer, bool hasCxxDtor)
{
assert(!isTaggedPointer());
if (!nonpointer) {
isa.cls = cls;
} else {
assert(!DisableNonpointerIsa);
assert(!cls->instancesRequireRawIsa());
isa_t newisa(0);
#if SUPPORT_INDEXED_ISA
assert(cls->classArrayIndex() > 0);
newisa.bits = ISA_INDEX_MAGIC_VALUE;
// isa.magic is part of ISA_MAGIC_VALUE
// isa.nonpointer is part of ISA_MAGIC_VALUE
newisa.has_cxx_dtor = hasCxxDtor;
newisa.indexcls = (uintptr_t)cls->classArrayIndex();
#else
newisa.bits = ISA_MAGIC_VALUE;
// isa.magic is part of ISA_MAGIC_VALUE
// isa.nonpointer is part of ISA_MAGIC_VALUE
newisa.has_cxx_dtor = hasCxxDtor;
newisa.shiftcls = (uintptr_t)cls >> 3;
#endif
// This write must be performed in a single store in some cases
// (for example when realizing a class because other threads
// may simultaneously try to use the class).
// fixme use atomics here to guarantee single-store and to
// guarantee memory order w.r.t. the class index table
// ...but not too atomic because we don't want to hurt instantiation
isa = newisa;
}
}
- 上面第一层判断是
isTaggedPointer
的断言,我会在后续文章重点分析
- 接下来是
nonpointer
的判断,因为 nonpointer
优化,适合普通结构不一样的!内存优化的 isa_t
结构
union isa_t {
isa_t() { }
isa_t(uintptr_t value) : bits(value) { }
Class cls;
uintptr_t bits;
#if defined(ISA_BITFIELD)
struct {
ISA_BITFIELD; // defined in isa.h
};
#endif
};
- 这里采用的是联合体&位域的搭配
- 一个
8字节指针
在 64位
下 其实可以存储很多内容,我们可以优化内存,在不同的位上,放不同的东西!
Struct
与 Union
主要有以下区别:
- 1.
struct
和 union
都是由多个不同的数据类型成员组成, 但在任何同一时刻, union
中只存放了一个被选中的成员, 而struct
的所有成员都存在。在 struct
中,各成员都占有自己的内存空间,它们是同时存在的。一个struct
变量的总长度等于所有成员长度之和。在Union
中,所有成员不能同时占用它的内存空间,它们不能同时存在。Union
变量的长度等于最长的成员的长度。
- 2. 对于
union
的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于struct
的不同成员赋值是互不影响的。
- 我们在看一下
isa 位域
情况 ( x86_64 架构)
# elif __x86_64__
# define ISA_MASK 0x00007ffffffffff8ULL
# define ISA_MAGIC_MASK 0x001f800000000001ULL
# define ISA_MAGIC_VALUE 0x001d800000000001ULL
# define ISA_BITFIELD \
uintptr_t nonpointer : 1; \
uintptr_t has_assoc : 1; \
uintptr_t has_cxx_dtor : 1; \
uintptr_t shiftcls : 44; /*MACH_VM_MAX_ADDRESS 0x7fffffe00000*/ \
uintptr_t magic : 6; \
uintptr_t weakly_referenced : 1; \
uintptr_t deallocating : 1; \
uintptr_t has_sidetable_rc : 1; \
uintptr_t extra_rc : 8
# define RC_ONE (1ULL<<56)
# define RC_HALF (1ULL<<7)
nonpointer
:表示是否对 isa 指针
开启指针优化
前言: iOS 高级之美 是本人总结了一些工作实际开发研究以及面试重点,围绕底层进行 源码分析
- LLDB 调试
- 源码断点
- 汇编调试
,让读者真正感受 Runtime底层之美~😊
目录如下:
iOS 高级之美(一)—— iOS_objc4-756.2 最新源码编译调试
iOS 高级之美(二)—— OC对象底层上篇
iOS 高级之美(三)—— OC对象底层下篇
iOS 高级之美(四)—— isa原理分析
iOS 高级之美(五)—— 类结构分析上篇
iOS 高级之美(六)—— malloc分析
iOS 高级之美(七)—— 24K纯技术男~KC_2019年终总结
iOS 高级之美(八)—— 类结构分析中篇
iOS 高级之美(九)—— 类结构分析下篇

一、isa的初始化
上一篇,我们在探索对象的初始化的时候一个非常重要的点就是:经过 calloc
申请的内存,但是这个指针怎么就和LGPerson
这个类所关联的呢? 下面就可以直接定位到:obj->initInstanceIsa(cls, hasCxxDtor);
- 我们知道了
obj
在上面只有一个指针
- 下面那段代码就可以分析
对象与类直接的联系
initIsa(cls, true, hasCxxDtor)
inline void
objc_object::initIsa(Class cls, bool nonpointer, bool hasCxxDtor)
{
assert(!isTaggedPointer());
if (!nonpointer) {
isa.cls = cls;
} else {
assert(!DisableNonpointerIsa);
assert(!cls->instancesRequireRawIsa());
isa_t newisa(0);
#if SUPPORT_INDEXED_ISA
assert(cls->classArrayIndex() > 0);
newisa.bits = ISA_INDEX_MAGIC_VALUE;
// isa.magic is part of ISA_MAGIC_VALUE
// isa.nonpointer is part of ISA_MAGIC_VALUE
newisa.has_cxx_dtor = hasCxxDtor;
newisa.indexcls = (uintptr_t)cls->classArrayIndex();
#else
newisa.bits = ISA_MAGIC_VALUE;
// isa.magic is part of ISA_MAGIC_VALUE
// isa.nonpointer is part of ISA_MAGIC_VALUE
newisa.has_cxx_dtor = hasCxxDtor;
newisa.shiftcls = (uintptr_t)cls >> 3;
#endif
// This write must be performed in a single store in some cases
// (for example when realizing a class because other threads
// may simultaneously try to use the class).
// fixme use atomics here to guarantee single-store and to
// guarantee memory order w.r.t. the class index table
// ...but not too atomic because we don't want to hurt instantiation
isa = newisa;
}
}
- 上面第一层判断是
isTaggedPointer
的断言,我会在后续文章重点分析
- 接下来是
nonpointer
的判断,因为 nonpointer
优化,适合普通结构不一样的!内存优化的 isa_t
结构
union isa_t {
isa_t() { }
isa_t(uintptr_t value) : bits(value) { }
Class cls;
uintptr_t bits;
#if defined(ISA_BITFIELD)
struct {
ISA_BITFIELD; // defined in isa.h
};
#endif
};
- 这里采用的是联合体&位域的搭配
- 一个
8字节指针
在 64位
下 其实可以存储很多内容,我们可以优化内存,在不同的位上,放不同的东西!
Struct
与 Union
主要有以下区别:
- 1.
struct
和 union
都是由多个不同的数据类型成员组成, 但在任何同一时刻, union
中只存放了一个被选中的成员, 而struct
的所有成员都存在。在 struct
中,各成员都占有自己的内存空间,它们是同时存在的。一个struct
变量的总长度等于所有成员长度之和。在Union
中,所有成员不能同时占用它的内存空间,它们不能同时存在。Union
变量的长度等于最长的成员的长度。
- 2. 对于
union
的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于struct
的不同成员赋值是互不影响的。
- 我们在看一下
isa 位域
情况 ( x86_64 架构)
# elif __x86_64__
# define ISA_MASK 0x00007ffffffffff8ULL
# define ISA_MAGIC_MASK 0x001f800000000001ULL
# define ISA_MAGIC_VALUE 0x001d800000000001ULL
# define ISA_BITFIELD \
uintptr_t nonpointer : 1; \
uintptr_t has_assoc : 1; \
uintptr_t has_cxx_dtor : 1; \
uintptr_t shiftcls : 44; /*MACH_VM_MAX_ADDRESS 0x7fffffe00000*/ \
uintptr_t magic : 6; \
uintptr_t weakly_referenced : 1; \
uintptr_t deallocating : 1; \
uintptr_t has_sidetable_rc : 1; \
uintptr_t extra_rc : 8
# define RC_ONE (1ULL<<56)
# define RC_HALF (1ULL<<7)
nonpointer
:表示是否对 isa 指针
开启指针优化