UITableView相关

ONE UITableView相关

1 重用机制

(1)初始化:首先假设有一个等待队列(重用队列)和一个使用中的队列,初始化的时候将队列创建好

(2)从重用队列中取出一个可重用的view:如果取出的为nil,说明当前没有可重用的view,返回nil。如果有的话,把等待队列中的这个view给移除掉,进行队列移动。并将其加入到使用队列中,将该view返回。

(3)添加视图到使用队列:判断view是否为空,不空则将其加入到使用队列中。

(4)重置:声明一个局部变量view,如果使用队列中有元素,删除加入到等待队列中。

(5)如果重用池中没有可重用的cell,那么创建一个cell。

2 数据源同步

一般在新闻、咨询类的App中使用。
现在有一个数据源,如果想要对其进行删除操作,删除操作需要在主线程中,对数据源还有会LoadMore操作,这个就需要是在子线程中运行。涉及的是多线程对数据源的访问。涉及到的就是数据源同步问题。解决方案如下:

2.1 并发访问、数据拷贝

数据在主线程中,需要将数据拷贝到子线程中进行网络请求、数据解析、预排版等操作。
如果在子线程还未反馈给主线程的时候,主线程进行了删除操作,那么等子线程返回过来的结果,是未删除一行数据的结果。这就会产生异常了。删除的数据又重新出现了。

处理方法就是,在主线程进行删除操作的时候,将该操作记录下来,然后在子线程即将传递给主线程的时候,同步删除操作。此时再更新UI就是正常的了。

2.2 串行访问

这就需要使用GCD串行队列了。

也就是分为,主线程、串行队列和子线程。
比如说在子线程中进行网络请求、数据解析的时候,到串行队列中将新增数据预排版。此时如果主线程要进行删除操作的话呢,怎么办?等着!在子线程的任务完成后,再同步主线程的删除操作。再回到主线程更新UI就可以啦。

3 视图的事件传递和视图响应

3.1 UIView和CALayer

关系:这个还真说不好,大概是UIView归功于CALayer,调节CALayer属性可以调整UIView的外观。
区别:UIView为其提供内容,以及负责处理触摸等事件,参与响应链。CALayer负责显示内容contents。

3.2 视图传递

多视图的点击如何确定是哪个视图去响应

在这里插入图片描述

hitTest内部实现:
判断当前view是否隐藏或者是透明的,如果是,则返回nil,不响应点击时间
判断点击范围是否在当前视图内,是的话,对它的子视图进行遍历,不是的话返回nil

3.3 视图响应

视图响应链,一层层往下找,找到了就执行,找不到就忽略,不会崩溃哦!!!

4 图像显示原理

CPU和GPU通过总线连接到一起的,在CPU传输位图到总线,再合适时机上传给GPU,GPU可以对这个图进行渲染,把结果放到Frame Buffer缓冲区中,再由视频控制器调用最后显示到手机的显示器上。

CPU工作:布局,显示(绘制),准备(如图片编解码),提交
GPU渲染管线工作:顶点着色,图源装配,光栅化,片段着色,片段处理,没用到过。。。

5 UI卡顿、掉帧

在规定的时间内,在下一个信号到来之前,没有准备好CPU和GPU对下一帧画面的合成,就会卡顿、掉帧。

滑动优化?一个性能优化方案

CPU:减轻它的压力,可以把对象创建、调整、销毁交给子线程。也可以把预排版交给子线程去做。

GPU:避免纹理渲染和视图混合

6 离屏渲染

在屏渲染:指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行。
离屏渲染:指的是GPU在当前屏幕缓冲区以外新开辟的一个缓冲区进行渲染操作。

当设置某一些UI视图的图层属性,如果说指定为在被预合成之前,不能用于直接显示的时候,那就触发了离屏渲染。典型的比如说设置视图的圆角属性。
何时触发呢?
圆角:当和maskToBounds一起使用的时候。

要尽可能避免离屏渲染,因为需要创建新的渲染缓冲区,有很大的内存开销。以及需要上下文切换,也有开销。

TWO OC相关

分类,关联对象,扩展,代理,通知,KVO,KVC,属性关键字

1 分类

分类用来做什么?
1、声明私有方法
2、分解体积庞大的类文件
3、把Framework的私有方法公开

分类的特点
1、运行时决议,通过runtime加到类上面
2、为系统类添加分类,系统类不能用扩展

分类的内容
1、实例方法
2、类方法
3、协议
4、属性

使用方法:加载调用栈
分类添加的方法效果上 ,可以覆盖原类方法
同名分类方法谁能生效取决于编译顺序
名字相同的分类会引起编译报错

2 关联对象

怎么为分类添加“成员变量”呢?

3 扩展

一、扩展用来做什么?
1、声明私有属性
2、声明私有方法
3、声明私有成员变量

二、特点
1、编译时决议
2、只以声明的形式存在,多数情况下寄生于宿主类的.m中,分类是有声明有实现
3、不能为系统类添加扩展,但是可以为系统类添加分类

4 代理

一、什么是代理?
是一种软件设计模式

以@protoclo形式实现

传递方式一对一
通知是一对多

二、代理的工作流程
涉及到协议,委托方,代理方
协议中定义的是方法和属性。

首先委托方要求代理方需要实现的接口。
代理方按照协议实现方法,可能返回一个处理结果给委托方
委托方调用代理方遵从的协议方法

代理方不一定实现协议中的所有方法

代理的时候一般使用weak以规避循环引用
代理方----strong----->委托方
代理方<----weak------委托方

5 通知

通知是使用观察者模式来实现的用于跨层传递消息的机制
传递方式一对多

发送者经由通知中心发送给观察者

如何实现通知机制?

6 KVO

Key-value observing
是oc对观察者设计模式的又一实现
isa混写实现KVO

isa混写实现KVO?
观察者在进行观察的时候,需要观察的是isa 指针
将这个指针指向新的方法进行setter的重写,修改指向。

注意
使用setter方法改变值KVO才会生效
使用setValue:forKey:改变值KVO才会生效
成员变量直接修改需手动添加KVO才会生效

6 KVC

Key-value coding键值编码技术

不违背面向对象

7 属性关键字

原子性
atomic:赋值和获取 安全,其他删除不管
nonatomic:

引用计数
retain/strong
assign/unsafe_unretained
weak
copy

assign
修饰基本数据类型,如int ,BOOL等
修饰对象类型时,不改变其引用计数
会产生悬垂指针

weak
不改变被修饰对象的引用计数
所指对象在被释放之后会自动置为nil

浅拷贝
对内存地址的复制,让目标对象指针和源对象指向同一片内存空间,没有新的内存分配

深拷贝
深拷贝让目标对象指针和源对象指针指向两篇内容相同的内存空间

深拷贝与浅拷贝:看是否开辟新的内存空间,是否影响了引用计数

copy关键字
mutable对象-copy-目标对象类型不可变-深拷贝
mutable对象-mutableCopy-可变-深拷贝
immutable对象-copy-不可变-浅拷贝
immutable对象-mutableCopy-可变-深拷贝

总结一下下,可变对象的copy和mutableCopy都是深拷贝
不可变对象的copy是浅拷贝,mutableCopy是深拷贝
copy方法返回的都是不可变对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Αиcíеиτеǎг

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值