OC是一门动态性比较强的编程语言
OC的动态性是有Runtime API来支撑的
Runtime API提供的接口基本都是C语言的,源码由C/C++/汇编语言编写
isa
在arm64架构之前,isa就是一个普遍的指针,存储着Class、Meta-Class对象的内存地址
从arm64架构开始,对isa进行了优化,变成了一个共用体(union)结构,还使用位域来存储更多的信息
struct objc_object {
isa_t isa;
}
union isa_t {
isa_t() { }
isa_t(uintptr_t value) : bits(value) { }
Class cls;
uintptr_t bits;
#if defined(ISA_BITFIELD)
struct {
ISA_BITFIELD;
};
#endif
};
# if __arm64__
# define ISA_MASK 0x0000000ffffffff8ULL
# define ISA_MAGIC_MASK 0x000003f000000001ULL
# define ISA_MAGIC_VALUE 0x000001a000000001ULL
# define ISA_BITFIELD
\
uintptr_t nonpointer : 1; \
uintptr_t has_assoc : 1; \
uintptr_t has_cxx_dtor : 1; \
uintptr_t shiftcls : 33; \
uintptr_t magic : 6; \
uintptr_t weakly_referenced : 1; \
uintptr_t deallocating : 1; \
uintptr_t has_sidetable_rc : 1; \
uintptr_t extra_rc : 19
# define RC_ONE (1ULL<<45)
# define RC_HALF (1ULL<<18)
void *objc_destructInstance(id obj)
{
if (obj) {
bool cxx = obj->hasCxxDtor();
bool assoc = obj->hasAssociatedObjects();
if (cxx) object_cxxDestruct(obj);
if (assoc) _object_remove_assocations(obj);
obj->clearDeallocating();
}
return obj;
}
union {
char bits;
struct {
char tall : 1;
char rich : 1;
char handsome : 1;
};
}_tallRichHandsome;
& 按位与 都是1才为1,否则为0
1、可以取出特定位的值 --- 将要取出的位设置为1,其他位设置为0 (&运算后,就可以得到要取的位的值)
2、将某一位设置为0 --- 将要设置的位置为0,其他位置为1 (&运算后,其他位不便,要设置的位肯定是为0的)
----------------------------------------------------------------
| 按位或 有1就为1,
1、将某一位设置为1 --- 将要设置的位设置为1,其他位设置为0 (|运算后,其他位不变,要设置的位肯定是为1的)
----------------------------------------------------------------
~ 按位取反 每位由1变0,0变1
----------------------------------------------------------------
!! 可以得到BOOL值
PS 此文为学习 李明杰 老师的 iOS底层原理课程 所写笔记