前言
今天这一篇我们来讲一下 Runloop和KVO
本章的主要回答的问题如下:
Runloop
- app如何接收到触摸事件的
- 为什么只有主线程的runloop是开启的
- 为什么只在主线程刷新UI
- PerformSelector和runloop的关系
- 如何使线程保活
今天这一篇我们来讲一下 Runloop和KVO
本章的主要回答的问题如下:
1 | // 发送通知 |
在解释这些内容之前 强烈建议认真研读一下这篇 一文全解iOS通知机制(经典收藏)文章 了解一下大概 所有的问题就迎刃而解了.
__block 修饰与否的区别?block的变量截获__block__strong、__weak修饰block发生copy时机Block访问对象类型的auto变量时,在ARC和MRC下有什么区别在回答所有问题之前我们需要了解一些block背景相关的知识. 如下:
数据结构的存储一般常用的有两种 顺序存储结构 和 链式存储结构
顺序存储结构:
比如,数组,1-2-3-4-5-6-7-8-9-10,存储是按顺序的。再比如栈和队列等
链式存储结构:
比如,数组,1-2-3-4-5-6-7-8-9-10,链式存储就不一样了 1(地址)-2(地址)-7(地址)-4(地址)-5(地址)-9(地址)-8(地址)-3(地址)-6(地址)-10(地址)。每个数字后面跟着一个地址 而且存储形式不再是顺序
时间频度
一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道.但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了.并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多.一个算法中的语句执行次数称为语句频度或时间频度.记为T(n).
业务分层、解耦,使代码变得可维护;
有效的拆分、组织日益庞大的工程代码,使工程目录变得可维护;
便于各业务功能拆分、抽离,实现真正的功能复用;
业务隔离,跨团队开发代码控制和版本风险控制的实现;
模块化对代码的封装性、合理性都有一定的要求,提升开发同学的设计能力;
在维护好各级组件的情况下,随意组合满足不同客户需求;(只需要将之前的多个业务组件模块在新的主App中进行组装即可快速迭代出下一个全新App)
1.最常用的就是cell的重用, 注册重用标识符
如果不重用cell时,每当一个cell显示到屏幕上时,就会重新创建一个新的cell
如果有很多数据的时候,就会堆积很多cell。
如果重用cell,为cell创建一个ID,每当需要显示cell 的时候,都会先去缓冲池中寻找可循环利用的cell,如果没有再重新创建cell
进程:
1.进程是一个具有一定独立功能的程序关于某次数据集合的一次运行活动,它是操作系统分配资源的基本单元.
2.进程是指在系统中正在运行的一个应用程序,就是一段程序的执行过程,我们可以理解为手机上的一个app.
3.每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内,拥有独立运行所需的全部资源
线程
1.程序执行流的最小单元,线程是进程中的一个实体.
2.一个进程要想执行任务,必须至少有一条线程.应用程序启动的时候,系统会默认开启一条线程,也就是主线程
什么情况使用 weak 关键字?
在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegate 代理属性
自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak,自定义 IBOutlet 控件属性一般也使用 weak;当然,也可以使用strong。在下文也有论述:《IBOutlet连出来的视图属性为什么可以被设置成weak?》
不同点:
weak 此特质表明该属性定义了一种“非拥有关系” (nonowning relationship)。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同assign类似, 然而在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。 而 assign 的“设置方法”只会执行针对“纯量类型” (scalar type,例如 CGFloat 或 NSlnteger 等)的简单赋值操作。
assign 可以用非 OC 对象,而 weak 必须用于 OC 对象
在 Objective-C 中,Runtime 是一套 C 语言的 API,用于在运行时操作对象、类和元类。通过 Objective-C Runtime,开发者可以在程序运行时动态地创建类、修改类的方法、获取类的属性信息、发送消息等。这使得 Objective-C 具有了诸多动态语言的特性,如动态绑定、消息转发、方法调用等。