2021-06-19

2022-06-13  本文已影响0人  TAsama

UI试图相关问题

大纲

重点:

1、重用机制
2、并发访问,更新数据(1、子线程同步主线程的操作2、多线程操作同步到串行队列执行)
3、传递和响应(传递由上到下,响应由下往上)
4、图像显示原理

5、处理UI卡顿掉帧的问题

6、异步绘制 实现了layer的delegate方法,即可进行异步绘制displayLayer

Object-C特性

大纲

重点

分类:

关联兑现:

扩展:

代理

通知:

KVO

KVC

属性关键字

Runtime

大纲

数据结构

消息传递

void objc_mgsSend(Void /* id self, SEL op, .../)
void objc_mgsSendSuper(Void /
struct objc_super super, SEL op, .../)

消息转发流程

resolveInstanceMethod: 返回YES 消息处理结束 ,返回NO forwardingargetForSelector: 返回转发目标, 返回nil methodSignatureForSelector: 返回方法签名,返回nil 报错

Method-Swizzling

动态添加方法

动态方法解析

内存管理

大纲

内存布局

内存管理方案
iOS是怎样管理内存的?

NONPOINTER_ISA
散列表

怎样实现快速分流
使用hash表查找,提高查找效率

数据结构
散列表的数据结构

Spinlock_t

RefcountMap

weak_table_t

MRC

手动引用计数

ARC

自动引用

引用计数管理

alloc实现

调用了c函数的calloc
此时并没有增加retainCount为1

retain

release

retainCount

dealloc
当前对象是否可以直接释放一句以下判断条件

以上全部为否才可以调用C函数直接释放
否则就要调用object_dispose() 进行释放

object_dispose

弱引用管理
添加弱引用变量的流程

清除weak变量,同事设置为nil

自动释放池

循环引用

考点

如何破除

__weak
__block(ARC下会被强引用)
__unsafe_unretained 修饰对象不会增加引用计数,但是会产生悬垂指针

解决NSTimer的循环引用问题
NSTimer会被Runloop引用,所以必须手动释放NSTimer来解除引用。
采用中间对象,同时弱引用NSTimer和对象,当对象被释放后,NSTimer回调后,判断弱引用对象已经释放为nil,此时则invalidate timer,将NSTimer置位nil,此时NSTimer也被成功释放。

Block

大纲

Block = 函数 + 上下文 + 对象
Block截获变量

Block

栈:拷贝 -》 堆:拷贝-》 堆(引用计数器+1)

注意:
使用了__block 修饰的的截获变量修改,会对block进行copy

多线程

大纲

GCD

  1. 同步/异步 和 串行/并发
    1.1 dispatch_sync(serial_queue /串行队列/,, ^{ // 任务 });
    1.2 dispatch_async(serial_queue, ^{ // 任务 });
    1.3 dispatch_sync(concurrent_queue /并发队列/, ^{ // 任务 });
    1.4 dispatch_async(concurrent_queue, ^{ // 任务 });

  2. dispatch_barrier_async
    2.1 如何实现多读单写
    dispatch_barrier_async(concurrent_queue, ^{ // 写操作 });

  3. dispatch_group
    3.1 A,B,C三个任务完成后,再执行D

NSOperation

  1. NSOperationQueue
    1.1 可以添加任务依赖
    1.2 可以添加任务执行状态
    1.3 可以控制最大并发量

任务执行状态

状态控制

  1. 只重写main时,则无法控制状态
  2. 重写了start,自行控制任务状态

通过KVO来监听NSOperation状态

NSThread

多线程和锁

@synchronized

单例对象

atomic

原子性赋值

OSSpinLock

自旋锁(循环等待访问,不释放当前资源)

NSLock
NSRecursiveLock

递归锁,可以重注

dispatch_semaphore_t

信号量

RunLoop

大纲

什么是RunLoop

RunLoop是通过内部维护的事件循环来对事件/消息进行管理的一个对象

  1. 事件循环

数据结构

CFRunLoop:

1 RunLoop -> n Model:

事件循环的实现机制

  1. 即将进入RunLoop
  2. 将要处理Timer/Source0事件
    通知Observer
  3. 处理Source0事件
  4. 如果有Source1要处理 -> 8. 处理唤醒时收到的消息
  5. 线程将要休眠
  6. 休眠、等待唤醒
    6.1 Source1
    6.2 Timer事件的回调
    6.3 外部手动唤醒
  7. 线程刚被唤醒
  8. 即将退出RunLoop

RunLoop的核心

RunLoop与NSTimer

NSCommonMode

RunLoop与多线程

怎样实现一个常驻线程

  1. 创建一个RunLoop
  2. 添加port/source给RunLoop
  3. 启动RunLoop

网络

大纲

HTTP协议
HTTPS与网络安全
TCP/UDP

上一篇下一篇

猜你喜欢

热点阅读