# 严禁转载!
<a href='#1'>一.objc对象内存模型</a>
<a href='#2'>二.Runtime</a>
<a href='#3'>三.Category</a>
- <a href='#3-1'>3.1 Category简介</a>
- <a href='#3-2'>3.2 Category类比extension</a>
- <a href='#3-3'>3.3 Category内存结构</a>
- <a href='#3-4'>3.4 Category加载</a>
- <a href='#3-5'>3.5 Category中的Load方法</a>
- <a href='#3-6'>3.6 Category与关联对象</a>
<a href='#4'>四. KVO 原理</a>
<a href='#5'>五. iOS App 启动过程 (未完待续) </a>
<a href='#6'>六. Block原理</a>
- <a href='#6-1'> Block 基本原理</a>
- <a href='#6-1'> __block 关键字捕获原理 </a>
<a href='#7'>七. GCD 与多线程 </a>
- <a href='#7-1'> GCD 基本概念及API的使用 </a>
- <a href='#7-2'> GCD 高级API使用 </a>
- <a href='#7-3'> GCD 部分原理分析 </a>
<a href='#8'>八. Runloop </a>
- <a href='#8-1'> Runloop基本原理 </a>
- <a href='#8-2'> Runloop models </a>
- <a href='#8-3'> Runloop 处理事件原理 </a>
- <a href='#8-4'> Runloop 常见应用 </a>
- <a href='#8-4-1'> AutoreleasePool </a>
- <a href='#8-4-2'> 事件响应 </a>
- <a href='#8-4-3'> 界面更新 </a>
- <a href='#8-4-4'> 定时器 </a>
- <a href='#8-4-5'> PerformSelecter </a>
- <a href='#8-4-6'> AFN 保活 </a>
- <a href='#8-4-7'> AsyncDisplayKit </a>
<a href='#9'>九. ARC </a>
- <a href='#9-1'> ARC 基本原理 </a>
- <a href='#9-2'> autorelease pool 原理</a>
<a href='#10'>十. Tableview 优化 </a>
- <a href='#10-1'> 预排版 </a>
- <a href='#10-2'> 避免离屏渲染 </a>
- <a href='#10-3'> 异步绘制 </a>
<a href='#11'>十一. 开源库 (未完待续)</a>
- <a href='#11-3'> ASDK 简介 </a>
<a href='#12'>十二. Weex </a>
- <a href='#12-1'> Weex 基本结构 </a>
- <a href='#12-2'> Weex JS Framework 详解 </a>
- <a href='#12-2-1'>适配前端层</a>
- <a href='#12-2-2'>渲染指令树</a>
- <a href='#12-2-3'>JS-Native的通信</a>
- <a href='#12-2-4'>JS Serive</a>
- <a href='#12-3'> Weex 渲染及事件响应原理 </a>
- <a href='#12-3-1'> Weex 渲染原理
- <a href='#12-3-2'> Weex 事件响应原理
- <a href='#12-4'> iOS上的Weex </a>
<a href='#13'>十三. iOS 中的渲染 </a>
- <a href='#13-1'> iOS中的渲染框架结构 </a>
- <a href='#13-2'> 理解CALayer </a>
- <a href='#13-3'> 渲染驱动器:CADisplayLink </a>
- <a href='#13-4'> 渲染过程 </a>
- <a href='#13-4'> 渲染时机 </a>
- <a href='#13-5'> CPU 渲染与 GPU 渲染 </a>
<a href='#14'>十四. 多线程 </a>
<h2 id='1'> 一、对象内存模型 </h2>
- isa指针的作用
- 对象的isa指向类对象,类对象的isa指向元类,元类的isa指向根元类,根元类的isa指向自己。
- 类对象的`superClass`指针指向父类对象,直到指向根类对象,根类对象的`superClass`指向`nil`,元类也如此,直到根元类,根元类的`superClass`指向根类对象
- 对象的内存分布
- 对象的变量表
- 对象大小
- 对象方法表
- cache?
- 协议
- char *name?
```c++
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */
```
<h2 id='2'> Runtime </h2>
reference:[objc runtime](http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/)
1. 消息接收
- 编译时间确定接受到的消息,运行时间通过`@selector`找到对应的方法。
- 消息接受者如果能直接找到`@selector`则直接执行方法,否则转发消息。若最终找不到,则运行时崩溃。
2. 术语
- `SEL`
- 方法名的C字符串,用于辨别不同的方法。
- 用于传递给`objc_msgSend(self, SEL)`函数
- `Class`
- `Class`是指向类对象的指针,继承于`objc_object`
- ``categoty``
- ``categoty``是结构体``categoty`_t`的指针:`typedef struct `categoty`_t *`categoty`;
`
- ``categoty``是在`app`启动时加载镜像文件,通过`read_imgs`函数向类对象中的`class_rw_t`中的某些分组中添加指针,完成``categoty``的属性添加
- `Method`
- 方法包含以下
- `IMP`:函数指针,方法的具体实现
- `types`:`char*`,函数的参数类型,返回值等信息
- `SEL`:函数名
3. 消息转发
- `objc_msgSend()`函数并不返回数据,而是它转发消息后,调用了相关的方法返回了数据。
- 整个流程:
1. 检测这个 `selector `是不是要忽略的。比如 `Mac OS X `开发,有了垃圾回收就不理会 `retain`, `release` 这些函数了。
2. 检测这个 `target` 是不是 `nil` 对象。`ObjC` 的特性是允许对一个` nil `对象执行任何一个方法不会 Crash,因为会被忽略掉。
3. 如果上面两个都过了,那就开始查找这个类的 `IMP`,先从 `cache `里面找,完了找得到就跳到对应的函数去执行。
4. 如果 `cache` 找不到就找一下方法分发表。
5. 如果分发表找不到就到超类的分发表去找,一直找,直到找到`NSObject`类为止。
6. 进入动态解析:`resolveInstanceMethod:`和`resolveClassMethod:`方法
7. 若上一步返回`NO`,进入重定向:`- (id)forwardingTargetForSelector:(SEL)aSelector`和`+ (id)forwardingTargetForSelector:(SEL)aSelector `
8. 若上一步返回的对象或者类对象仍然没能处理消息或者返回`NO`,进入消息转发流程:`forwardInvocation`
- 重定向和消息转发都可以用于实现**多继承**
4. `Objective-C Associated Objects`关联对象
- 在 `OS X 10.6 `之后,`Runtime`系统让`Objc`支持向对象动态添加变量。涉及到的函数有以下三个:
```objc
void objc_setAssociatedObject ( id object, const void *key, id value, objc_AssociationPolicy policy );
id objc_getAssociatedObject ( id object, const void *key );
void objc_removeAssociatedObjects ( id object );
```
- 这些方法以键值对的形式动态地向对象添加、获取或删除关联值。其中关联政策是一组枚举常量:
```c++
enum {
OBJC_ASSOCIATION_ASSIGN = 0,
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
OBJC_ASSOCIATION_RETAIN = 01401,
OBJC_ASSOCIATION_COPY = 01403
};
```
5. `Method Swizzling` 方法混淆
- 作用是修改`SEL`对应的`IMP`指针
- 用于`debug`,避免数组越界等问题.
<h2 id='3'> Categoty </h2>
reference:[美团技术博客:深入理解Objective-C:Category
](https://tech.meituan.com/DiveIntoCategory.html)
<h3 id = '3-1'> categoty 简介</h3>
- ``categoty``开头动态地给类添加属性及方法,通过这个特性,使得`objc`可以模拟多继承。也可以把一个类拆分到各个文件中,使用方可以按需加载。也可以多人协作共同完成一个类。
<h3 id = '3-2'> categoty 类比 extension </h3>
- `extension`看起来很像一个匿名的``categoty``,但是`extension`和有名字的``categoty``几乎完全是两个东西。 `extension`在编译期决议,它就是类的�
考试类精品--常见iOS面试中考察的知识点整理.zip
需积分: 5 171 浏览量
2024-02-06
10:12:18
上传
评论
收藏 1.32MB ZIP 举报
码农阿豪
- 粉丝: 1w+
- 资源: 1754
最新资源
- 工程经济学期末报告(工科版)
- 七夕情人节表白代码(易语言表白程序/易语言表白源码)
- 华为OD机试C卷- 字符串序列判定(Java & JS & Python & C).md-私信看全套OD代码及解析
- 华为OD机试C卷- 字符串筛选排序(Java & JS & Python & C).md-私信看全套OD代码及解析
- 华为OD机试C卷- 字符串拼接(Java & JS & Python & C).md-私信看全套OD代码及解析
- 华为wifi7详细介绍
- 华为OD机试C卷- 字符串排序(Java & JS & Python).md-私信看全套OD代码及解析
- FANUC机器人4种启动方式的区别.docx
- 华为OD机试C卷- 字符串分割(二)(Java & JS & Python).md-私信看全套OD代码及解析
- 华为OD机试C卷- 字符串变换最小字符串(Java & JS & Python & C).md-私信看全套OD代码及解析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈