interview questions

ios的风已吹过,继续ios还是走c/c++后台开发?
或者风停了猪都摔下来了,需要更专业的人士?
你为什么拿高薪?别人为什么招聘你?
为了节省时间,需要更高效的方法,更高效的分工,花一些代价取得更大的成果是非常划算的

准备

2 weeks

深入了解并精通iOS编程
设计思想及解决问题的思路

博客

唐巧 http://blog.devtang.com/

期刊

https://www.objccn.io/

开源库研究透彻

AFNetWorking
SDWebImage
FMDB
Mantle 数据到模型
JSONModel
Masonry 布局
AsyncDisplayKit

框架

weex
reactive native
ReactiveCocoa

语言

Object-C
Swift
C/C++

擅长点

架构 - 设计
网络

做过什么

偶扑
多米

系统全面了解

iOS 系统知识都了解并精通
iOS最新知识都有所想法

其他

语言表达能力要增强
多张口阅读文集

注意

需要更多的项目经验
偶扑+多米 APP项目经验
偶扑整个APP、蜜语部分
蜜语用到的技术:

主要问题:
内存管理
runloop 、runtime
多线程
UI效果优化,离屏渲染
性能优化
崩溃处理
架构设计
Pods的原理
网络通信


今日头条
c++虚函数几内存布局
i o s基更深入一些
如何知道一个类对象释放了,打印日志
UIController是否有UIResponder,有,能响应事件

粉笔网

三面都是技术面
iOS基础知识扎实就可以,一些简单的算法题
UI相关的Autolayout原理及刷新相关函数
layoutSubviews:addSubViews、frame变化、滚动UIScrollView、改变UIView大小(触发父类),都会触发调用layoutSubViews;
layoutIfNeeded:如果有需要刷新的标记,立即调用layoutSubviews进行布局,setNeedsLayout只会标记,不会立即刷新
注意:约束的动画需要在block使用layoutIfNeeded,否则动画不起作用;
drawRect:viewDidLoad后、sizeToFit、frame变化,都会触发drawRect

高德地图

做定位的主要问C++知识
简单的算法题
二面:
准备:linux系统相关,C++高级(多线程,同步,进程间通信等)

小红书

基本知识点
设计问题
视频播放技术
离屏渲染优化?

解决的问题
多米音乐可能爆机的问题,编写单元测试,将业务分离,根据SDK业务接口可能返回的任一情况对整个业务进行单元测试;

优酷土豆

项目上的问题
网络+多媒体相关问题
结构设计及相应处理
ios内存管理深入问题
iOS编译原理

京东

面试太简单
多米问题:
个别南方用户有时网络异常,切换南边备用服务器;
改用http服务请求;
偶扑问题:
功能冗余切除,结构重组,设计模式; MVC --> MVVM ,数据与模型的设计;
性能改善,启动性能,加载缓存数据假象APP已启动;
UI及流畅度优化,数据性能;

美团点评

ios load category:
http://blog.csdn.net/a316212802/article/details/49894421
category被附加到类上面是在map_images的时候发生的
附加category到类的工作会先于+load方法的执行
类和category中都可以有+load方法,都可以被调用
load的执行顺序是先类,后category,而category的+load执行顺序是根据编译顺序决定的
crash log 解析,crash +APP包+符号文件(DYSM) 用xcode查看,或者用命令执行具体的崩溃地址查看
AES,RSA 实现原理

股票雷达

下午5点

常用开源库
AFNetworking //
SDWebImage // image cache, handle image in background thread

FMDB // seal with sqlite (light db)
Masonry // NSLayoutConstraint
SWTableViewCell // tableview cell 滑动效果,
--> SWTableViewCell是一个继承自UITableViewCell的自定义Cell,它上面放了一个UIScrollerView,这个滚动视图上放了Cell内容、左侧操作菜单和右侧操作菜单。主要技术是scrollview滑动,速度velocity的处理。
YYText // coretext
Mantle json to model // kvc
ReactiveCocoa // runtime swizzle,将block、KVO、delegate统一为signal来处理;RAC有一个主要的优点,就是提供了一个单一的,统一的方法去处理异步的行为,包括delegate方法,blocks回调,target-action机制,notifications和KVO;
MLeaksFinder // 判断视图相关对象是否释放,质量较高的代码
--> 基类 NSObject 添加一个方法 -willDealloc 方法,该方法的作用是,在对象将要释放时,先用一个弱指针指向 self,并在一小段时间(3秒)后,通过这个弱指针调用 -assertNotDealloc,而 -assertNotDealloc 主要作用是直接中断言;
swizzle相关方法:viewDidAppear、viewWillAppear、popViewController、pushViewController等

问题:
变高的cell的自适应?
self.tableView.estimatedRowHeight = 100; //保障滑动流畅性,使需要的cell才进行高度自适应计算
cell.contentView.translatesAutoresizingMaskIntoConstraints = NO;
cell.model // 赋予数据模型,确定控件中子视图是否有数据
addConstraint:widthConstraint(NSLayoutConstraint) //添加宽度约束
[cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height; //根据宽度约束计算及视图中数据,计算出cell高度
removeConstraint:widthConstraint //移除宽度约束
PS:可对model.hash为key对cell自适应计算的高度进行缓存(NSCache),可极大提高效率;

iOS各个版本特点
参考:https://developer.apple.com/library/content/releasenotes/General/WhatsNewIniOS/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008246
iOS1.0 2007 未公开
iOS5.0 2011 引入ARC机制,storyboard
iOS6.0 2012 Maps, UICollectionView、AutoLayout、OpenGL ES
iOS7.0 2013 TouchID
iOS8.0 2014 ApplePay
iOS9.0 2015 统一HTTPS,3D touch、swift2
iOS10.0 2016 推送通知升级、语音识别
iOS 11.0 2017 Machine Learning Model,相机功能调整的比较多

性能稳定:
苹果限制了热更新,更需要代码发布的稳定性;
静态分析,crash报告上传
内存:循环引用、大数据处理、缓存
使用instrument的leaks检测,MLeaksFinder检测
UI:动画优化、大量加载、渲染
使用CADisplayLink来监控FPS,CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器;
启动:启动时间优化,launch前,launch后
测试:单元测试;
XCTest,边界测试
热修复:
JSPatch 的原理就是:JS传递字符串给OC,OC通过 Runtime 接口调用和替换OC方法;

问题:
timer的处理,timer的会强引用其target,所以处理方案可以是:
将target换成一个代理对象,代理对象weak引用原target,并将timer的selector转发给原target;
将timer变成传递block使用,block弱引用target即可;

网络优化 & 安全
有自己的 url --> ip 的DNS映射缓存;
请求压缩;
RTT(route trip time),一个链路传输时间,能反应网络拥塞状态;
MSS(Maximum Segment Size), IP包的最大报文段长度;
合理的并发数;
多条线路切换,有TCP长连接、HTTP等混合的方式;
可靠性保障:必须要传达的请求,将请求保存在本地直到发送成功;
安全:
重要信息不要明文放到plist或DB中,要经过加密处理;
每次的服务请求要加鉴权验证处理;
最好重要信息都加一些自定义的加密;
reveal可以在越狱手机 上可以查看任何APP的UI结构
OC代码是可以反编译出来的,不要在代码中获取关键数据,可以从服务器拉取;
反编译可以查看到很多代码逻辑及重要数据信息;
协议或软件总有漏洞,所以关键的数据最好做一层自己的加密;
PS:
manager.securityPolicy.allowInvalidCertificates = YES; //AFNetworking设置允许使用无效证书;

https://zhuanlan.zhihu.com/p/22943142
http://ios.jobbole.com/90594/

精通UI界面开发
熟悉MVC,MVVM,组件化思维,了解RN;
不同版本iOS的特性与差异
Git和GitFlow分支管理,Hotpatch机制
性能和稳定性优化经验,熟悉常见性能稳定策略
用户体验的极致追求
良好的自测习惯
多线程、网络、安全等编程经验
TCP/HTTP/SPDY/DNS/CDN网络知识,了解网络优化策略及安全防范机制
较强的技术影响力,较高的钻研学习热情;

魔漫相机

笔试基础
面试简单问问
机试 实现UI部分
基本功要求非常扎实
手动实现代码的能力与效率

猿题库

自身APP实现的技术相关
简单算法题
经验不足

熟悉常用SQL语句
create database name
drop database name
alter table name add column col type
select * from table1 where col=value
select count as totalcount from table1
select sum(field1) as sumvalue from table1
'insert into table1 (field1,field2) values(value1,value2) '
delete from table1 where something
update table1 set field1=value1 where field1 like ’%value1%'
参考:http://www.cnblogs.com/acpe/p/4970765.html

性能分析与调优:
UI渲染优化,数据缓存优化,设计优化
用ARC管理内存
| 在正确的地方使用reuseIdentifier
| 尽可能设置Views为完全透明opaque,尽可能减少subviews
| 避免庞大的XIB
| 不要block主线程
| 在Image Views中调整图片大小
| 选择正确的Collection
| 打开gzip压缩
| 重用和延迟加载(lazy load) Views
| cache缓存数据
| 权衡渲染方法
| 使用shadowPath加快渲染
| 重用机制,尤其是大开销对象

美团

主要问题:
知识点全面细致了解,书写总结,开博
系统深入了解
自己擅长点,优点
解决的疑难点
维护的开源站+自己的APP
通用的框架非常熟:AF,SD,Mantle等;

主攻:
网络 + 疑难问题:iOS网络精通
设计 SDK+系统架构:架构及设计模式全面了解
-->查看 Stack Overflow 与 gitbook

meta class
Class 本身也有一个 isa 指针,指向的是它的 MetaClass;

block底层原理:
实际编译成C++是一个结构体及函数,会对外部变量进行引用;
注意block形成循环引用的状况;
block是为了解决什么问题使用的?

该变readonly属性的变量
使用 setValue:forKey:(KVC)改变变量;
因为readonly标识编译期间不生成setter方法,而setValue:forKey:是运行时方法,骗过了编译器;

图片渲染过程:
CPU 计算好显示内容提交到 GPU,GPU 渲染完成后将渲染结果放入帧缓冲区,随后视频控制器会按照 VSync 信号如下图1-4所示,逐行读取帧缓冲区的数据,经过可能的数模转换传递给显示器显示;
参考:http://www.cocoachina.com/ios/20151203/14549.html

png与jpg的区别:
png有透明通道, jpg没有.png有手机硬解码加速 无损显示效果好;

png加载速度快, 显示效果好;
xcode也会对png图片进行优化,jpg没有;
jpg高压缩率,适合扫描使用;

Runloop的结构和循环流程:
一个线程对应一个runloop,runloop中有几种模式用于区别不同任务;runloop循环处理observer、timer、source三类;
在线程中添加runloop(并添加port)保证线程不退出;
将timer添加到runloop中,保证timer执行;

NSOperationQueue和GCD区别:
NSOperationQueue对operation及线程状态及依赖关系能进行全面控制,GCD能更方便直观的执行;

线程安全:
加锁的几种方式:
@synchronized { 代码块 }
NSLock / NSUnlock
dispatch_semaphore_t 信号量,信号量为0不可用 dispatch_semaphore_wait (-1) / dispatch_semaphore_signal (+1);
NSCondition 条件锁,NSCondition和NSLock、@synchronized等是不同的是,NSCondition可以给每个线程分别加锁,加锁后不影响其他线程进入临界区;提供更高级的用法wait和signal,和条件信号量类似;
NSRecursiveLock 递归锁,总共加锁解锁的次数要匹配;

NSURLSession 与 NSURLConnection:
NSURLSession是NSURLConnection 的替代者,在2013年苹果全球开发者大会(WWDC2013)随iOS7一起发布,是对NSURLConnection进行了重构优化后的新的网络访问接口;
AFNetWorking 2.0 -> 3.0 将 NSURLConnection升级为NSURLSession了;
NSURLSession 创建了三种datatask,NSURLSessionDataTask,NSURLSessionUploadTask和NSURLSessionDownloadTask,创建的task都是挂起状态,需要resume才能启动;
NSURLSession有取消、暂停、继续三个方法;
NSURLConnection创建即默认启动,可取消,但不能继续访问,需要再次创建请求;
NSURLSession的断点续传更快捷,可暂停继续上传;
NSURLConnection下载文件时,先将整个文件下载到内存,然后再写入沙盒,如果文件比较大,就会出现内存暴涨的情况;而使用NSURLSessionUploadTask下载文件,会默认下载到沙盒中的tem文件夹中,不会出现内存暴涨的情况,但在下载完成后会将tem中的临时文件删除,需要在初始化任务方法时,在completionHandler回调中增加保存文件的代码;
NSURLSession有sessionWithConfiguration接口,可对session的进行配置,更加灵活;
参考:http://www.cnblogs.com/kakaluote123/articles/5426923.html

NSURLConnection是怎么封装的:
NSURLConnectionDelegate | NSURLConnectionDataDelegate | NSURLConnectionDownloadDelegate

CFNetwork
CFNetwork更侧重与网络协议,Foundation则更倾向于API数据请求等,虽然框架也提供了一些操作,但是远不如CFNetwork丰富。在学习CFNetwork之前,需要先了解2个基础API框架: CFSocket、CFStream;

做过什么动画?
动画实际上是对CALayer进行的操作;
CAAnimation \ CAMediaTiming协议
iOS9.0之后新增CASpringAnimation类,它实现弹簧效果的动画,是CABasicAnimation的子类;
核心动画可以使用的类:
CABasicAnimation | CAKeyframeAnimation | CATransition | CAAnimationGroup | CASpringAnimation
参考:http://www.cocoachina.com/ios/20160517/16290.html

https 原理
请求服务 -> 返回crt公用证书(没有显示warning) -> 随机生成key + crt加密 发送到服务端 -> crt解密获得key -> 客户端服务端都使用key对数据进行对称加密传输;
因为key是只有客户端跟服务端才知道的,所以保证了通信安全;
比http多了安全策略;

RSA加密原理:
RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
非对称加密算法:公钥+私钥

SDWebImage框架结构,缓存机制

git问题:
rebase原理(将一个分支的全部修改添加到另一个分支):先将test分支的代码checkout出来,作为工作目录,然后将master分支从test分支创建起的所有改变的补丁,依次打上,如果打补丁的时候出现了问题,就会提示你处理冲突,处理好了,可以运行git rebase –continue;
git流程:暂存/提交/推送

组件化:
组件化的了解,代码拆分以解决业务上的耦合;
组件化为了解决什么问题
组件和组件之间没有明确的约束;
组件单独开发、单独测试,不能揉入主项目中开发,测试也可以针对性的测试;
使用url路由跳转,创建视图控制器:


image.png

参考:http://www.jianshu.com/p/afb9b52143d4

JSPatch 原理
Runtime 改变函数指向;
JSPatch 能做到通过 JS 调用和改写 OC 方法最根本的原因是 Objective-C 是动态语言,OC 上所有方法的调用/类的生成都通过 Objective-C Runtime 在运行时进行,我们可以通过类名/方法名反射得到相应的类和方法,也可以替换某个类的方法为新的实现,还可以新注册一个类,为类添加方法;
消息传递:

单例与全局变量的区别
单例是一个share只能访问唯一的一个实例变量,alloc也只能返回唯一的一个实例,copy也只能返回唯一一个实例,所以创建的方法都只能指向唯一一个实例;
全局变量是是指向一个类变量,是可以变化的,可以生成多个实例;

设计模式的掌握
单例 观察 工厂 代理 建造者
构建模式:build pattern, 构造函数将很多属性出入进去创建一个对象;
IOS可以创建时候传入block函数,参数为一个构造模型对象,然后在block参数中进行属性赋值,构造模型运用参数创建一个对象并返回;
参考:http://www.cocoachina.com/ios/20150313/11328.html

MVC 与 MVVC
model view controller
model-view view controller
实际设计。。

编写单元测试
比如写一个网络库,如何测试该网路库,用例写的更全面一些
接触不多,知道用自带的test进行编写

如果没有instruments如何检测memory leak,zombie object之类的问题
原理:如果不使用instruments工具,就自己利用runtime进行函数hook替换加入响应代码进行监控处理;
通过hook改变函数实现,监听是否释放,视图控制器及子视图等,在停止使用后;
在dealloc函数中打印log可以调试页面是否释放;
zombie(过渡释放):打开enable zombie object,相当于用一个僵尸来替换默认的dealloc实现,也就是在引用计数降到0时,该僵尸实现会将该对象转换成僵尸对象;
HeapInspector-for-iOS 它通过 hook 掉 alloc,dealloc,retain,release 等方法,来记录对象的生命周期。具体的检测内存泄露的方法和原理,与 Instrument 的 Allocations 一致;

基本算法
分层打印:将打印完毕的节点的子节点放入队列尾部待打印(vector)
时间复杂度为O(N)的排序?

最近读写什么书
Jobs

读过的开源框架:
AFNetworking
github上关注的。。。

解决的问题
pod更新的问题,苹果不支持js注入的三方架构
去 stackoverflow上去查找;

自己擅长的地方
C/C++混编
网络编程
平台架构

other


你可能感兴趣的:(interview questions)