Hung's Tech Tips

Walk it, like I talk it

顺德两天一夜

自驾,行程比较自由,就不安排具体时间点了,饭店甜品店自由选择。

饭店推荐

富荣农家私房菜


主打桑拿鸡,鸡有鸡味

汕尾两天一夜

7.26早上

9:30 深圳龙华接lq

12:00 午饭

  • 丰富大排档(首选,吃海鲜,不太好排队)
  • 内湖麻鱼煤(可以从隔壁源记买牛肉饼汤)
  • 食源海鲜粿
  • 杯杯鲜(果汁,二马路)
  • 源记菜粿(虾扇饺,菜粿,二马路)
  • 渔村大路(杂鱼汤、扁食汤)
    Read more »

Objc类结构分析

objc_class & objc_object

objc_class是个结构体,所有的Class都是以它为模版创建的,以下是底层定义的一部分:

1
2
3
4
5
6
7
8
9
10
11
12
struct objc_class : objc_object {
objc_class(const objc_class&) = delete;
objc_class(objc_class&&) = delete;
void operator=(const objc_class&) = delete;
void operator=(objc_class&&) = delete;
// Class ISA;
Class superclass;
cache_t cache; // formerly cache pointer and vtable
class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags

// ....
}
Read more »

类与isa关联原理

Objc对象的本质

oc定义的类在经过Clang编译转为C++后,我们就可以看到oc中的类实际上是结构体,如下:

1
2
3
4
5
6
7
8
9
10
// NSObject的定义
struct NSObject_IMPL {
Class isa;
};

// 继承自NSObject的TestClass的定义
struct TestClass_IMPL {
struct NSObject_IMPL NSObject_IVARS;
NSString *_name;
};

上面转译出来的代码中,可以看到TestClass结构体里面包含它所继承的NSObject的完整结构。而oc对象的本质其实就是结构体,子类中包含完整的父类结构体,从而达到继承的目的。

Read more »

Objc底层 alloc流程记录

引用Objc开源版本为906.2

1. callAlloc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static ALWAYS_INLINE id
callAlloc(Class cls, bool checkNil, bool allocWithZone=false)
{
// 编译优化,cls一般不为空,该判断为false概率较大
if (slowpath(checkNil && !cls)) return nil;
// 判断一个类是否有自定义的allocWithZone
if (fastpath(!cls->ISA()->hasCustomAWZ())) {
return _objc_rootAllocWithZone(cls, nil);
}

// No shortcuts available.
if (allocWithZone) {
return ((id(*)(id, SEL, struct _NSZone *))objc_msgSend)(cls, @selector(allocWithZone:), nil);
}
return ((id(*)(id, SEL))objc_msgSend)(cls, @selector(alloc));
}

slowpathfastpath__builtin_expect为0和为1对应的宏定义,目的是告诉编译器输入参数为false或true的概率较大,减少指令跳转。

Read more »
0%