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

一、前面篇章复习
很高兴优秀的你打开这一篇专栏,这一篇专栏我们还是承接 上一篇 继续分析!
上一篇我们分析到 alloc
的流程,通过一些特色技巧展开
通过上面的方法我们锊出了,alloc
的流程

这个流程分析的过程中,有一段非常重要的代码!我们抓住了两个核心重点!
static __attribute__((always_inline))
id
_class_createInstanceFromZone(Class cls, size_t extraBytes, void *zone,
bool cxxConstruct = true,
size_t *outAllocatedSize = nil)
{
if (!cls) return nil;
assert(cls->isRealized());
// Read class's info bits all at once for performance
bool hasCxxCtor = cls->hasCxxCtor();
bool hasCxxDtor = cls->hasCxxDtor();
bool fast = cls->canAllocNonpointer();
size_t size = cls->instanceSize(extraBytes);
if (outAllocatedSize) *outAllocatedSize = size;
id obj;
if (!zone && fast) {
obj = (id)calloc(1, size);
if (!obj) return nil;
obj->initInstanceIsa(cls, hasCxxDtor);
}
else {
if (zone) {
obj = (id)malloc_zone_calloc ((malloc_zone_t *)zone, 1, size);
} else {
obj = (id)calloc(1, size);
}
if (!obj) return nil;
// Use raw pointer isa on the assumption that they might be
// doing something weird with the zone or RR.
obj->initIsa(cls);
}
if (cxxConstruct && hasCxxCtor) {
obj = _objc_constructOrFree(obj, cls);
}
return obj;
}
obj = (id)calloc(1, size)
obj->initInstanceIsa(cls, hasCxxDtor)
- 这两行代码应该直接决定了
alloc
的作用

二、展开分析alloc的意义
下面开始展开分析这两个核心内容
1: 创建指针,申请内存

经过 calloc
函数创建了一个指针,这个指针是怎么创建,这个源码按照我们上一节的探索思路很容易得到 :libmalloc
源码出处!
calloc()
- malloc_zone_calloc(default_zone, num_items, size);
- ptr = zone->calloc(zone, num_items, size);
- default_zone_calloc()
- nano_malloc()
- void *p = _nano_malloc_check_clear(nanozone, size, 0);
- size_t slot_bytes = segregated_size_to_fit(nanozone, size, &slot_key); // Note slot_key is set here
- ptr = segregated_next_block(nanozone, pMeta, slot_bytes, mag_index);
```objc
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, assign) long height;
@property (nonatomic, strong) NSString *hobby;
前言: iOS 高级之美 是本人总结了一些工作实际开发研究以及面试重点,围绕底层进行 源码分析
- LLDB 调试
- 源码断点
- 汇编调试
,让读者真正感受 Runtime底层之美~😊
目录如下:
iOS 高级之美(一)—— iOS_objc4-756.2 最新源码编译调试
iOS 高级之美(二)—— OC对象底层上篇
iOS 高级之美(三)—— OC对象底层下篇
iOS 高级之美(四)—— isa原理分析
iOS 高级之美(五)—— 类结构分析上篇
iOS 高级之美(六)—— malloc分析
iOS 高级之美(七)—— 24K纯技术男~KC_2019年终总结
iOS 高级之美(八)—— 类结构分析中篇
iOS 高级之美(九)—— 类结构分析下篇

一、前面篇章复习
很高兴优秀的你打开这一篇专栏,这一篇专栏我们还是承接 上一篇 继续分析!
上一篇我们分析到 alloc
的流程,通过一些特色技巧展开
通过上面的方法我们锊出了,alloc
的流程

这个流程分析的过程中,有一段非常重要的代码!我们抓住了两个核心重点!
static __attribute__((always_inline))
id
_class_createInstanceFromZone(Class cls, size_t extraBytes, void *zone,
bool cxxConstruct = true,
size_t *outAllocatedSize = nil)
{
if (!cls) return nil;
assert(cls->isRealized());
// Read class's info bits all at once for performance
bool hasCxxCtor = cls->hasCxxCtor();
bool hasCxxDtor = cls->hasCxxDtor();
bool fast = cls->canAllocNonpointer();
size_t size = cls->instanceSize(extraBytes);
if (outAllocatedSize) *outAllocatedSize = size;
id obj;
if (!zone && fast) {
obj = (id)calloc(1, size);
if (!obj) return nil;
obj->initInstanceIsa(cls, hasCxxDtor);
}
else {
if (zone) {
obj = (id)malloc_zone_calloc ((malloc_zone_t *)zone, 1, size);
} else {
obj = (id)calloc(1, size);
}
if (!obj) return nil;
// Use raw pointer isa on the assumption that they might be
// doing something weird with the zone or RR.
obj->initIsa(cls);
}
if (cxxConstruct && hasCxxCtor) {
obj = _objc_constructOrFree(obj, cls);
}
return obj;
}
obj = (id)calloc(1, size)
obj->initInstanceIsa(cls, hasCxxDtor)
- 这两行代码应该直接决定了
alloc
的作用

二、展开分析alloc的意义
下面开始展开分析这两个核心内容
1: 创建指针,申请内存

经过 calloc
函数创建了一个指针,这个指针是怎么创建,这个源码按照我们上一节的探索思路很容易得到 :libmalloc
源码出处!
calloc()
- malloc_zone_calloc(default_zone, num_items, size);
- ptr = zone->calloc(zone, num_items, size);
- default_zone_calloc()
- nano_malloc()
- void *p = _nano_malloc_check_clear(nanozone, size, 0);
- size_t slot_bytes = segregated_size_to_fit(nanozone, size, &slot_key); // Note slot_key is set here
- ptr = segregated_next_block(nanozone, pMeta, slot_bytes, mag_index);
```objc
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, assign) long height;
@property (nonatomic, strong) NSString *hobby;
前言: iOS 高级之美 是本人总结了一些工作实际开发研究以及面试重点,围绕底层进行 源码分析
- LLDB 调试
- 源码断点
- 汇编调试
,让读者真正感受 Runtime底层之美~😊
目录如下:
iOS 高级之美(一)—— iOS_objc4-756.2 最新源码编译调试
iOS 高级之美(二)—— OC对象底层上篇
iOS 高级之美(三)—— OC对象底层下篇
iOS 高级之美(四)—— isa原理分析
iOS 高级之美(五)—— 类结构分析上篇
iOS 高级之美(六)—— malloc分析
iOS 高级之美(七)—— 24K纯技术男~KC_2019年终总结
iOS 高级之美(八)—— 类结构分析中篇
iOS 高级之美(九)—— 类结构分析下篇

一、前面篇章复习
很高兴优秀的你打开这一篇专栏,这一篇专栏我们还是承接 上一篇 继续分析!
上一篇我们分析到 alloc
的流程,通过一些特色技巧展开
通过上面的方法我们锊出了,alloc
的流程

这个流程分析的过程中,有一段非常重要的代码!我们抓住了两个核心重点!
static __attribute__((always_inline))
id
_class_createInstanceFromZone(Class cls, size_t extraBytes, void *zone,
bool cxxConstruct = true,
size_t *outAllocatedSize = nil)
{
if (!cls) return nil;
assert(cls->isRealized());
// Read class's info bits all at once for performance
bool hasCxxCtor = cls->hasCxxCtor();
bool hasCxxDtor = cls->hasCxxDtor();
bool fast = cls->canAllocNonpointer();
size_t size = cls->instanceSize(extraBytes);
if (outAllocatedSize) *outAllocatedSize = size;
id obj;
if (!zone && fast) {
obj = (id)calloc(1, size);
if (!obj) return nil;
obj->initInstanceIsa(cls, hasCxxDtor);
}
else {
if (zone) {
obj = (id)malloc_zone_calloc ((malloc_zone_t *)zone, 1, size);
} else {
obj = (id)calloc(1, size);
}
if (!obj) return nil;
// Use raw pointer isa on the assumption that they might be
// doing something weird with the zone or RR.
obj->initIsa(cls);
}
if (cxxConstruct && hasCxxCtor) {
obj = _objc_constructOrFree(obj, cls);
}
return obj;
}
obj = (id)calloc(1, size)
obj->initInstanceIsa(cls, hasCxxDtor)
- 这两行代码应该直接决定了
alloc
的作用

二、展开分析alloc的意义
下面开始展开分析这两个核心内容
1: 创建指针,申请内存

经过 calloc
函数创建了一个指针,这个指针是怎么创建,这个源码按照我们上一节的探索思路很容易得到 :libmalloc
源码出处!
calloc()
- malloc_zone_calloc(default_zone, num_items, size);
- ptr = zone->calloc(zone, num_items, size);
- default_zone_calloc()
- nano_malloc()
- void *p = _nano_malloc_check_clear(nanozone, size, 0);
- size_t slot_bytes = segregated_size_to_fit(nanozone, size, &slot_key); // Note slot_key is set here
- ptr = segregated_next_block(nanozone, pMeta, slot_bytes, mag_index);
```objc
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, assign) long height;
@property (nonatomic, strong) NSString *hobby;