one step

作者: ruiying | 来源:发表于2019-12-08 14:35 被阅读0次

    UI视图:
    (1)UITabView相关:重用机制的理解和运用,包括对数据源多线程的操作就涉及到数据源重复的问题
    (2)事件传递&视图响应
    (3)图像显示原理
    (4)UI卡顿,掉帧
    (5)UI绘制原理/异步控制
    (6)离屏渲染
    OC语言
    (1)分类(实现机制原理)
    (2)关联对象
    (3)扩展,代理
    (4)KVO,KVC(实现机制及原理)
    (5)NSNotivication
    (6)属性关键字
    runtime:
    (1)对象,类对象,元类对象
    (2)消息传递机制
    (3)消息转发流程
    (4)方法缓存
    (5)Method-Swizzling
    (6)动态添加方法
    内存管理:
    (1)ARC
    (2)MRC
    (3)引用计数机制
    (4)弱引用表
    (5)AutoReleasePool
    (6)循环引用
    Block
    (1)block的本质
    (2)截获变量特性
    (3)__block修饰符的本质
    (4)block的内存管理
    (5)循环引用
    多线程
    (1)GCD
    (2)NSOperation/NSOperationQuen
    (3)NSThread
    (4) 线程同步,资源共享
    (5)互斥锁,自旋锁,递归锁等
    runloop
    (1)什么是runloop
    (2)mode/sourse/Timer/Observer
    (3)事件循环机制
    (4)Runloop与NSTimer
    (5)runloop与线程之间的关系
    (6)常驻线程
    网络
    (1)HTTP协议
    (2)HTTPS与网络安全
    (3)TCP/UDP
    (4)DNS解析
    (5)Session/Cookie
    设计模式:
    (1)六大设计原则
    (2)责任链
    (3)桥接
    (4)适配器
    (5)单例
    (6)命令
    架构/框架
    (1)图片缓存框架
    (2)时长统计框架
    (3)复杂页面架构
    (4)客户端整体架构
    算法:
    (1)字符串反转
    (2)链表反转
    (3)有序数组合并
    (4)Hash算法
    (5)查找两个子视图的共同父视图
    (6)求无序数组当中的中位数
    第三方库
    (1)AFNetworking
    (2)SDWebImageView
    (3)Reactive Cocoa
    (4)AsyncDispayKit

    初级:
    (1)精通OC语言基础
    (2)精通UIKit等Cocoa Framework
    (3)熟悉网络通信机制以及常用数据传输协议
    (4)具备主流开源框架的实用经验
    中级:
    (1)扎实的编程,数据结构,算法基础
    (2)深入理解语言机制,内存管理,网络,多线程,GUI
    (3)精通常用设计模式,框架,架构
    (4)良好的分析,解决问题的能力
    高级:
    (1)解决研发工程中的关键问题和技术难题
    (2)调优设备流量,性能,电量等
    (3)较强的软件设计能力
    (4)对iOS内部原理有深刻理解
    资深:
    (1)精通高性能编程及性能调优
    (2)灵活运用数据结构,算法解决复杂程序设计问题
    (3)提供性能优化,日志搜集,统计分析等方案
    (4)架构,模块设计

    表达的宗旨:
    (1)简洁性
    排版清晰(2-3页左右即可)
    简洁不是少,亮点,优势仍然要突出
    挑选重要的,突出的表达
    无关的,次要的不需要表达
    (2)真实性
    可以包装,但不能伪造
    量化指标去说明(前后crash量的变化,线上bug数的变化,开发成本节约了多少)
    (3)全面性
    邮箱,联系方式等基本信息要全面
    履历过的公司要全面
    履历的每家公司尽量都有一个十分亮点的项目体现

    涵盖内容四要素:
    (1)基本信息
    姓名,学校,现居,学历,工作年限,专业,电话,邮箱(最好不好用QQ邮箱有的企业邮箱可能会屏蔽掉,头像)
    (2)工作经历
    2014--至今 任职公司。iOS初级 负责人等
    (3)项目经验
    列举比较有亮点的2-3个项目
    明确自己承担的角色(主导,参与,核心研发者)
    项目背景描述,方案,效果
    demo
    主导/参与/核心参与XXX项目
    背景:1.改善原油代码的臃肿,不易维护 2.需求快速迭代的开发成本较高3稍有不慎就会引发bug4......
    方案:根据项目合理运用桥接,命令等设计模式对原油业务进行分层,解耦,降低代码重合度
    效果:日崩溃亮<X左右;重构之后代码清晰易读 3万行代码减到2万行

    (4)擅长技能
    能通过多线程技术解决实际开发当中的疑难杂症
    精通(熟练掌握)OC语言
    掌握MVC,MVVM等主流框架,熟悉桥接,命令,适配器等常见的设计模式
    熟悉feed流性能优化,理解UI从创建到渲染到屏幕上的整体流程,机制

    一:UI视图:

    image.png

    1.重用机制


    image.png

    虚线部分为当前屏幕锁展示的内容(A2--A6),假设此时状态是向上滑动的中间状态,那么A1就被放进了重用池(A)里面了,如果继续往上滑动,A7就会从重用池里面去根据指定的identifier标志符取出一个可重用的cell。假如说A1-A7都是同一个identifier,那么A7就可以重用A1所创建的内存或者控件,这样就达到了复用或者重用的目的。

    2.数据源同步问题


    image.png

    删除操作和子线程的网络加载,就涉及多线程对共享数据的访问,这就需要考虑关于数据源的同步问题
    那么如何解决tableView在多线程访问和修改数据源同步的问题呢?
    (1)并发访问 数据拷贝


    image.png

    缺点:数据源较大时数据源的拷贝 对内存的开销教大
    (2)串行访问


    image.png
    介绍:在子线程里数据请求数据解析后在串行队列中(子线程中进行)进行新增数据预排版等同时用户在主线程删除了某一行数据,那么此时需要等一下,等串行队列操做完,再再串行队列中同步数据删除,之后再在主线程刷新UI。
    缺点:在子线程处理任务特别耗时的时候,删除这个操作会有一定延时。

    二.UIView和CALayer

    image.png

    两者的区别:
    (1)UIView为CALayer提供内容,以及负责处理触摸等时间,参与相应链
    (2)CALayer负责显示内容content

    事件传递与视图响应机制

    如:


    image.png
    image.png

    第一个方法是返回响应的view(哪个视图响应就返回哪个view),第二个是判断触摸处是否在这个view范围内

    image.png

    简述:点击屏幕传递给UIApplication,UIApplication再传递给UIWindow,UIWindow就会通过hitTest返回最终的响应view,其实hitTest内部会调用pointInside这个方法来判断当前所点击的point是否在UIWindow范围内,在的话会遍历他的子视图来查找最终响应这个事件的视图,遍历的方式是采用倒序的方式遍历,也就是说最后添加到UIWindow上的视图会最优先遍历到。在每个UIView里都会调用HitTest方法,最终会返回最终的响应视图hit,如果有值的话那么这个视图就作为最终的事件响应视图,就结束了事件传递的流程。 假如没有的话,在window范围内的话那么UIWindow本身就作为事件响应视图。如果也不在当前window上 那么就会返回nil,则会被丢弃,忽略该响应


    屏幕快照 2019-08-23 下午1.58.21.png
    代码实战

    方形button 只让圆形区域接受事件响应,红色不接受(p4:37)


    image.png

    视图响应流程

    image.png image.png image.png
    image.png

    简述:点击空白处,最先由C2接收这个事件,如果它不处理的话 会传递给下一个响应者B2,B2也不处理的话 会传给父视图A,若A也不响应 那么会沿着响应链一直往上传递直到传递到UIApplication,如果最终没有任何视图去处理这个事件的话,那么这个事件就会被忽略掉,不做任何处理

    图像显示原理

    语言属性

    image.png
    分类(Category)

    你用分类做了哪些事?
    (1)声明私有方法:定义一个分类 把头文件放在.m文件 进行声明和定义,对外不暴露
    (2)分解体积庞大的类文件
    (3)把Framework的私有方法公开
    分类的特点:
    (1)运行时决议:编好分类文件后,是在runtime在分类中添加的内容 再添加上去
    (2)可以为系统类添加分类
    分类中都可以添加哪些内容?
    (1)实例方法
    (2)类方法
    (3)协议
    (4)属性(只声明了set方法和get方法,并不是添加实例变量)


    image.png image.png

    代理

    image.png image.png image.png

    通知(NSNotification)

    image.png image.png image.png
    image.png

    KVC(键值编码技术)

    屏幕快照 2019-08-28 下午2.19.37.png

    方法里面的key是没有任何限制的,如果在我们知道一个类或者实例 他内部私有成员变量名称的话,我们在外界可以通过已知的key对私有成员变量进行访问和设置的。这个角度KVC会破坏面向对象思想的!

    ########value for key的系统实现流程


    屏幕快照 2019-08-28 下午2.44.40.png

    访问器是否存在的访问规则
    如果实现了下面其中一种get方法即可认为他的访问器方法是存在的


    屏幕快照 2019-08-28 下午2.38.33.png

    实例变量的说明
    同名的同名变量或相似名称的成员变量---实际上就涉及到成员变量是哪个的问题 有些疑问


    屏幕快照 2019-08-28 下午2.44.06.png
    setValue forkey调用流程
    屏幕快照 2019-08-28 下午2.47.24.png

    属性关键字

    (1)读写权限:readonly,readwrite(默认)
    (2)原子性:atomic(默认),nonatomic
    atomic可以保证赋值获取是线程安全的,但是不包括操作,比如atomic修饰是一个数组,对数组的赋值和获取是保证线程安全的,但是对数组的元素的添加和移除是不在atomic的负责范围之内的。
    (3)引用计数 retain/strong(用来修饰对象),assign/unsafe_unretained(既可以修饰基本数据类型又可以修饰对象类型,其中第二个在MRC中使用频繁)
    (4)weak
    (5)copy

    assign:
    悬垂指针:assign修饰的对象 被释放之后,assign指针仍然指向原对象内存地址,这个时候继续访问的话 就会因为悬垂指针的原因 产生内存泄漏


    weak: 屏幕快照 2019-08-28 下午3.04.07.png
    test:

    assign和weak的区别:
    assign和weak都不改变被修饰对象的引用计数。assign既可修饰基本数据类型也可修饰对象,weak只用来修饰对象,两者所修饰对象被释放之后 assign修饰的会仍然指向原对象的内存地址,而weak修饰的会自动置为nil

    copy


    屏幕快照 2019-08-28 下午3.16.20.png 屏幕快照 2019-08-28 下午3.20.15.png 屏幕快照 2019-08-28 下午3.23.45.png
    屏幕快照 2019-08-28 下午3.25.48.png
    屏幕快照 2019-08-28 下午3.28.35.png
    屏幕快照 2019-08-28 下午3.31.36.png 屏幕快照 2019-08-28 下午3.36.21.png
    屏幕快照 2019-08-28 下午3.38.43.png

    (1)分类实现原理:
    是由运行时来决议的,不同分类当中含有同名分类方法谁最终生效取决于谁最后参与编译,最后参与编译的同名分类方法会最终生效, 如果分类当中添加的分类方法恰巧是宿主类方法中的某一个方法时,分类方法会覆盖宿主类的方法。
    (2)KVO的实现原理:
    是系统关于观察者模式的一种实现,KVO运用了isa回写技术来动态运行时去为某一个类添加一个子类,重写它的setter方法,同时把原有类的isa指针指向新创建的这个类上面
    (3)能否为分类添加成员变量:
    关联对象这个技术去添加成员变量

    相关文章

      网友评论

          本文标题:one step

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