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视图:

1.重用机制

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

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

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

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

两者的区别:
(1)UIView为CALayer提供内容,以及负责处理触摸等时间,参与相应链
(2)CALayer负责显示内容content
事件传递与视图响应机制
如:


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

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

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

视图响应流程




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

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


代理



通知(NSNotification)




KVC(键值编码技术)

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

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

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

setValue forkey调用流程

属性关键字
(1)读写权限:readonly,readwrite(默认)
(2)原子性:atomic(默认),nonatomic
atomic可以保证赋值获取是线程安全的,但是不包括操作,比如atomic修饰是一个数组,对数组的赋值和获取是保证线程安全的,但是对数组的元素的添加和移除是不在atomic的负责范围之内的。
(3)引用计数 retain/strong(用来修饰对象),assign/unsafe_unretained(既可以修饰基本数据类型又可以修饰对象类型,其中第二个在MRC中使用频繁)
(4)weak
(5)copy
assign:
悬垂指针:assign修饰的对象 被释放之后,assign指针仍然指向原对象内存地址,这个时候继续访问的话 就会因为悬垂指针的原因 产生内存泄漏


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








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