@Rookie
2020-07-01T17:15:01.000000Z
字数 4094
阅读 702
找工作
函数式编程关心数据的映射,命令式编程关心解决问题的步骤
首先,最直观的角度来说,函数式风格的代码可以写得很精简,大大减少了键盘的损耗(其次,函数式的代码是“对映射的描述”,它不仅可以描述二叉树这样的数据结构之间的对应关系,任何能在计算机中体现的东西之间的对应关系都可以描述——比如函数和函数之间的映射(比如 functor);比如外部操作到 GUI 之间的映射(就是现在前端热炒的所谓 FRP)。它的抽象程度可以很高,这就意味着函数式的代码可以更方便的复用。
作者:nameoverflow
链接:https://www.zhihu.com/question/28292740/answer/100284611
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
函数式编程具有五个鲜明的特点。
1. 函数是"第一等公民"
所谓"第一等公民"(first class),指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。
2. 只用"表达式",不用"语句"
"表达式"(expression)是一个单纯的运算过程,总是有返回值;"语句"(statement)是执行某种操作,没有返回值。函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。
3. 没有"副作用"
所谓"副作用"(side effect),指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。
函数式编程强调没有"副作用",意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。
4. 不修改状态
上一点已经提到,函数式编程只是返回新的值,不修改系统变量。因此,不修改变量,也是它的一个重要特点。
5. 引用透明
引用透明(Referential transparency),指的是函数的运行不依赖于外部变量或"状态",只依赖于输入的参数,任何时候只要参数相同,引用函数所得到的返回值总是相同的。
函数式编程到底有什么好处,为什么会变得越来越流行?
1. 代码简洁,开发快速
函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。
2. 接近自然语言,易于理解
函数式编程的自由度很高,可以写出很接近自然语言的代码。
3. 更方便的代码管理
函数式编程不依赖、也不会改变外界的状态,只要给定输入参数,返回的结果必定相同。因此,每一个函数都可以被看做独立单元,很有利于进行单元测试(unit testing)和除错(debugging),以及模块化组合。
4. 易于"并发编程"
函数式编程不需要考虑"死锁"(deadlock),因为它不修改变量,所以根本不存在"锁"线程的问题。不必担心一个线程的数据,被另一个线程修改,所以可以很放心地把工作分摊到多个线程,部署"并发编程"(concurrency)。
2.什么是ABI?
3.什么是MVC,请结合CocoaTouch说明?
4.什么是MVVM,请设计View moled需要考虑哪些?
泛型能够让开发者编写自定义需求已经任意类型的灵活可用的的函数和类型。能够让我们避免重复的代码。用一种清晰和抽象的方式来表达代码的意图。
泛型函数, 类型参数, 扩展一个泛型类型,关联类型等等
7.defer、guard的作用?
问号?
a.声明时添加?,告诉编译器这个是Optional的,如果声明时没有手动初始化,就自动初始化为nil
b.在对变量值操作前添加?,判断如果变量时nil,则不响应后面的方法。
叹号!
a.声明时添加!,告诉编译器这个是Optional的,并且之后对该变量操作的时候,都隐式的在操作前添加!
b.在对变量操作前添加!,表示默认为非nil,直接解包进行处理
9.举例swift中模式匹配的作用?
10.swift中private与OC中block的区别?
11.什么是capture list,举例说明用处?
12.swift中private与fileprivate的区别?
13.REST、HTTP、JSON是什么?
14.delegate解决了什么问题,Notification与它有什么不同?
15.描述一个ViewController的生命周期
16.LLVM与Clang的区别?
17.Class、objc的区别是什么?
1.OC你了解的锁有哪些?在你回答基础上进行二次提问;
追问一:自旋和互斥对比?
追问二:用C/OC/C++,任选其一,实现自旋或互斥?口述即可!
Block循环引用(防止Block循环引用就是要防止对象之间引用的闭环出现)
delegate循环引用问题(delegate循环引用问题比较基础,只需注意将代理属性修饰为weak即可)
NSTimer循环引用
非OC对象内存处理
大次数循环内存暴涨问题
参考地址
追问一:非OC对象如何处理?
追问二:若常用框架出现内存泄漏如何处理?
3.容错处理你们一般是注意哪些?
拦截存在潜在崩溃危险的方法,在拦截的方法里进行相应的处理,就可以防止方法的崩溃
步骤:
1、通过category给类添加方法用来替换掉原本存在潜在崩溃的方法。
2、利用runtime方法交换技术,将系统方法替换成我们给类添加的新方法。
3、利用异常的捕获来防止程序的崩溃,并且进行相应的处理。
1.编译过程做了哪些事情;
2.字典大致实现原理;
3.block和函数指针的理解;
4.一般开始做一个项目,你的架构是如何思考的?
5.你了解的UIKit结构?
几大区域简介
- 栈区(stack):
由编译器管理(分配释放)
存放函数参数值、局部变量的值(函数中的基本数据类型)
栈区的操作方式类似数据结构中的栈(先进后出)
- 堆区(heap):
由程序员管理(分配释放),若程序员不释放,程序结束时可能由系统(OS)回收
存放程序员new出来的对象
堆的操作方式与数据结构中的堆不同,操作方式类似于链表
- 全局区(又称静态区)(static):
由编译器管理(分配释放),程序结束后由系统释放
存放全局变量和静态变量
有两块区域组成全局区(静态区),一块是存放未初始化的全局变量和静态变量,另一块是初始化完成的全局变量和静态变量,这两块区域是相邻的
- 文字常量区:
由编译器管理(分配释放),程序结束后由系统释放
存放常量字符串
- 程序代码区:
存放函数的二进制代码
2.你是如何组件化解耦的?
每一个类对象中都一个对象方法列表(对象方法缓存)
类方法列表是存放在类对象中isa指针指向的元类对象中(类方法缓存)
方法列表中每个方法结构体中记录着方法的名称,方法实现,以及参数类型,其实selector本质就是方法名称,通过这个方法名称就可以在方法列表中找到对应的方法实现.
当我们发送一个消息给一个NSObject对象时,这条消息会在对象的类对象方法列表里查找
当我们发送一个消息给一个类时,这条消息会在类的Meta Class对象的方法列表里查找
4.runloop内部实现逻辑?
5.你理解的多线程?
6.GCD执行原理?
1.混淆代码
2.本地数据加密
3.网络传输数据加密
4.URL编码加密
5.程序结构混排加密
6.加入无效代码
8.YYAsyncLayer如何异步绘制?
? 坚持下面几个原则争取在编码阶段避免一些性能问题。
优化计算的复杂度从而减少 CPU 的使用
在应用响应交互的时候停止没必要的任务处理
设置合适的 QoS
将定时器任务合并,让 CPU 更多时候处于 idle 状态
第三方库
个人建议:时间允许的话自己多造造轮子,风险可控,好维护
项目架构
崩溃&性能调优
1. 代码规范,定期code review了吗
2. 复杂列表的滚动时FPS可以保持在60帧左右吗?
3. 页面加载渲染的耗时能不能进一步减小?
4. 网络缓存有做吗,UIWebView / WKWebView的常用静态资源做缓存了吗
5. App的启动时间可以在保持最小业务逻辑的同时再减小一点吗?
避免使用重绘
内存优化,卡顿优化,布局优化,电量优化,启动优化,体积优化,网络优化,
https://github.com/skyming/iOS-Performance-Optimization
SDWebImage的最大并发数是多少?
_downloadQueue.maxConcurrentOperationCount = 6;
SDWebImages是如何识别图片的?
NSData+ImageContentType.m中,根据图片文件十六进制数据的第一个字节判断
图片的十六进制第一个字节.png
SDWebImage 缓存图片命名规则?
为了防止名称重复,对其进行 md5 运算
默认下载的超时时长是多少?15秒
默认缓存的时间?一周
2.yykit如何异步渲染?
3.runtime动态创建一个类,需要注意什么?
4.你理解的runloop和线程之间的关系?
5.技术架构如何搭建?
kmp算法
7.字符串如何预处理?
8.https和ssl在握手方向有什么区别?
9.怎么防止反编译
10.代码文件编译生成过程,编译和链接有什么区别,链接做了什么事情
11.用C语言实现一个通知流程,说思路即可!
12.A B 线程执行到一半去执行C线程,用OC和C各自怎么实现!
13.tableview怎么优化,优化后还是感觉卡怎么办!
14.ARC的实现原理,什么情况下用MRC比ARC好!
15.怎么定位到野指针的地方。如果还没定位到,这个对象被提前释放了,怎么知道该对象在什么地方释放的
16.你平时做过什么有技术难点的东西,然后解决难点!