美文网首页
iOS深入总结

iOS深入总结

作者: 苹果上的小豌豆 | 来源:发表于2018-09-05 13:54 被阅读0次

    1.UI视图


    1.tableView重用机制的理解与运用

    简单说就是当滑动 tableview 的时候,刚离开视图的 cell 会被放到复用池 中,等下一个 cell需要 显示时,会先看复用池中有没有 cell 如果有的时候 ,就从复用池中拿出来cell ,没有的话就重新创建cell

    假设我们有100行数据,但在我们设计的行高情况下,屏幕 只能显示4行,所以,当加载view的时候,实际我们需要创建5个cell,只这4个cell是静态显示,当我们用手指向上滑动即下方的第5个cell向上滑进界面的过程中,我们发现第一行的cell会滑出界面,当滑出后,第一行这个cell对象会被放到对应重用标示符重用队列中,第5行显示在屏幕上。当我继续向上滑动,第二行的cell对象同样会放在重用队列中,第6个cell将获得重用队列中的一个cell,这样,这样在后面的重用中就就可以正常的工作起来了,可以很好的控制内存。

    static NSString *CellTableIdentifier = @"CellTableIdentifier ";

    是重用标示符;

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellTableIdentifier];

    意思是定义一个cell,在tableview中的可重用队列中寻找有CellTableIdentifier标识的UITableViewCell,以进行重用。

    这个Identifier可以由我们自由定义成一些字符串。当然,如果在队列中有这样的UITableViewCell,那么则返回它给 cell,若没有,则返回nil给cell。因为我们在写程序时经常需要用到好几个表格,每个表格中的cell布局都不一样,所以我们需要将在同一个表格的cell(布局一样)进行标记Identifier,这样,在重用的时候可以得到匹配的cell。当有多个表格是可以定义多个标记。

    if (cell == nil) {

    cell = [[[UITableViewCell alloc]

    initWithStyle:UITableViewCellStyleDefault

    reuseIdentifier:CellTableIdentifier] autorelease];

    若返回的是nil,即cell==nil,则我们需要分配空间并初始化一个cell,而且需 要关联reuseIdentifier,以便后面重用的时候能够根据Identifier找到这个cell,若cell不为nil,则重用成功,并可 return此cell。

    2.事件传递和视图响应链

    参考文章iOS 点击事件传递及响应

    史上最详细的iOS之事件的传递和响应机制-原理篇

    响应者对象:继承自UIResponder的对象称之为响应者对象。UIApplication、UIWindow、UIViewController和所有继承UIView的UIKit类都直接或间接的继承自UIResponder

    iOS中的事件

    iOS中的事件可以分为3大类型:

    触摸事件

    加速计事件

    远程控制事件

    这里我们只讨论iOS中的触摸事件。

    3.UI绘制原理

    iOS系统主要提供两种途径去创建高质量的图形:OpenGL或者使用原生Quarts、Core Animation和UIKit。

    Quartz是主要的绘制途径,它提供了基于路径绘制、抗锯齿绘制、渐变色、图形绘制、颜色、变形和PDF文档的创建展示和解析能力。                                          UIKit是对Quartz的线条、图片和颜色操作的封装。                                             Core Animation提供了对在动画中修改UIView属性的的支持,同时还可以实现自定义动画。

    参考文章

    iOS UI绘制原理

    4.UI卡顿、掉帧分析以及流式页面的整体性能优化方案

    在开发中我们常常会遇到布局比较复杂的cell,在滑动的时候会导致界面不流畅,出现卡顿的现象,这是由于CPU计算和GPU渲染,之间未及时交换数据丢失帧导致的结果。

    1.imageView尽量设置为不透明

    2.UIView的背景色尽量不要设置为clearColor,这样也会触发alpha叠加,在tableView滑动的时候是非常消耗性能的。

    子视图的背景色尽可能设置成其superView的背景色,这样图层合成的时候不会触发blend操作。最好不使用带alpha通道的图片,如果有alpha尽量让美工取消alpha通道。  alpha通道的概念特地请教了下公司UI MM,是透明的意思。

    3.cell上layer尽量避免使用圆角。

    在工作中关于滑动界面我们会时常遇到cell行设置头像为圆角等需求,这时候我们尽量避免使用layder.cornerRadius,因为这会触发离屏渲染。离屏渲染很耗时间。离屏渲染:是GPU渲染区的一个渲染缓冲区,我们所用的所有显示屏的图形图像都是通过GPU进行渲染,然后显示在屏幕上。GPU负责渲染会把渲染的图形放到缓冲区然后CPU就会发一个垂直信号显示到屏幕。如果要使用圆角,我们可以设置为layer.shouldRasterize = YES,其实这个设置是触发光栅化,可以大大提高渲染的性能。我的理解光栅化就是类似于cell的重用机制。光栅化:把第一次渲染好的图层放到缓冲区,那么下次不需要再离屏渲染直接就可以从缓冲区拿去使用。

    5.离屏渲染等



    2.OC语言特性



    1.分类、

    2.扩展、

    3.代理、

    4.通知、

    5.KVC、KVO

    6.关联对象等


    3.Block

    1.Block本质、

    2.截获变量特性、

    3.__block修饰符、

    4.Block的内存管理和循环引用问题



    4.多线程

    1.GCD、

    2.NSOperation、

    3.NSThread

    4.NSLock、NSRecursiveLock、OSSpinLock等各种锁的特点



    5.网络相关

    1.HTTP、

    2.HTTPS、

    3.TCP、UDP等协议

    4.DNS解析、Session、Cookie等内容



    6.设计模式

    1.六大设计模式

     2.责任链、

    3.桥接、

    4.适配器、

    5.单例、

    6.命令等



    7.算法

    1.字符串反转算法

    2.链表反转算法

    3.有序数组合并算法

    4.  Hash算法

    5.查找两个子视图的共同父视图算法

    6.求无序数组中的中位数算法


    8.三方库

    1.AFNetworking,Moya,Alamofire 网络库

    2.SDWebImage,Kingfisher图片缓存库

    3.SnapKit,Masonry,布局约束库

    4.HandyJSON,SwiftyJSON,MJExtetion,数据模型库

    5.SVProgressHUD,MBProgressHUD提示框

    6.MJRefresh,IQKeyboardManagerSwift,UITableView+FDTemplateLayoutCell,SPPageMenu,FDFullscreenPopGesture,YYKit,FSPagerView,SwipeMenuViewController,SkeletonView,YYText等

    相关文章

      网友评论

          本文标题:iOS深入总结

          本文链接:https://www.haomeiwen.com/subject/pnaowftx.html