一、计算机网络
计算机网络主要考量的还是传输层和应用层部分的知识。
- 浏览器输入url到网页显示经历了什么过程?
- TCP三次握手:具体是怎么握手?为什么要三次握手?两次行不行?为什么不行?三次握手,第二次和第三次分别因为什么?
- TCP是如何保持可靠传输的(拥塞控制,慢启动等等概念的理解)
- TCP为什么要四次挥手,TIME_WAIT为什么至少设置两倍的MSL时间?
- TCP三次握手的详细数据传递,四次挥手详细数据内容,数据包组成、TIME_WAIT状态,2MSL,RTT,重传、滑动窗口、拥塞原理等等
- TCP、UDP面向连接、无连接具体理解,他们的区别,如何将 UDP 改造成和 TCP 功能相似
- TCP/IP四层协议,OSI七层协议,每层都有啥对应的协议,原理是啥
- http报文结构,http中超文本超是啥意思,http请求的组成
- http 报文头部含有什么,multipart了解吗
- http的状态码,200,304,301,http请求报文,响应报文
- get和post请求的区别?什么情况下用到?POST传输的数据都有哪些格式呢(这里需要搞定http各种请求传输的数据格式)
- 描述一次完整的http请求
- 什么是cookie,什么是session,区别联系,cookie的本质是什么
- http1.0,1.1,2.0的区别
- https有几次握手和挥手?https的原理。http有几次挥手和握手?TLS在哪一网络层,基本原理是什么?
- https与中间人攻击
- HTTPS,安全层除了SSL还有,最新的? 参数握手时首先客户端要发什么额外参数
- HTTPS是什么?握手过程,SSL原理,非对称加密了解多少
- 证书是干什么用的
二、算法
- 剑指 offer 上面的题目都是面试过程中的算法高频题,特别是二叉树和字符串,栈队列,链表,跳台阶问题一定要弄懂并且熟练。
- 八大排序算法的复杂度,概念,最好最坏情况,手写都是必须要掌握的,其中的重点是快排和堆排序,对于快排的优化,快排的基础原理,系统 API 快排的实现原理等都是必须要掌握的基础知识。
- 二分查找在面试过程中也比较常见,因为比较简单,包括二分查找的变种。
- 二叉树的前中后序的递归与非递归遍历方式,以及层序遍历和蛇形遍历都是重点。
- 海量数据如何找到重复次数最多的那个 优化
- 海量数据,但是都是1~100之间的,如何找到重复次数最多的那个
- 面试算法题一般不难,掌握技巧很重要。二叉树相关的算法题基本都要往二叉树的遍历上靠,链表相关的算法题基本都要往额外的“帮助指针”上面靠。
三 、数据结构
- 在面试过程中这一类主要是和算法来一起考,数据结构一般主要会问栈与堆的区别,栈与队列的区别等等,在前端的面试中,红黑树这类的很少被问到。
四 、编译原理
- 主要需要了解程序的编译过程的基础概念就OK。
五 、操作系统
- 操作系统老生常谈的就是进程,线程的概念和区别,几个状态,以及他们的调度方式,通信方式,保持安全等等知识点,基本面试都会被考到一点,这一部分需要牢牢掌握,实在理解不了就背下来。
- 说说递归和普通的循环方式有什么区别
- 计算机存储系统是指?哪些存储系统能提高程序执行的效率?
- 段错误和栈溢出分别在什么时候会出现,为什么
- 其他方面的包括页置换等等基础知识,知道概念就OK,在前端面试过程中这部分不是特别重点考量的点。
五 、数据库
- 数据库这部分也比较简单,主要就是 ACID 等基础概念,几大范式,简单的 sql 语句。
六、 设计模式
- 工厂方法,抽象工厂,简单工厂的区别和联系
- 装饰者
- 观察者
- ***模式等等
7⃣️、概率论
- 三门问题
- 红黑球等等常见问题百度即可
7⃣️、Linux
- 主要包括基本的 shell 编程,基本的脚本命令,重点是 grep,ps,top,free等
八、版本控制
- 版本控制主要包括 Git 和 SVN
- git 的基础概念,基本命令,包括 merge 和 rebase 的区别等。
- Git 和 SVN 的区别,异同点
- 平时开发中,版本控制的流程是怎么样的
九、通用语言基础
- 面向对象的多态。多态的几种方式
- 各个语言中的单例模式
- 内存管理方式
- static 和 const 的作用和区别
- C 语言的内存分段
【一】、iOS专业知识点
1、内存管理
-
Autorelease pool的底层实现原理,与 Runloop 的关系, autoreleasing 关键字。
-
属性的关键字,他们具体的底层实现以及区别?
-
浅拷贝和深拷贝的区别?
(只有对不可变对象进行copy操作是指针复制(浅复制) )
(其它情况都是内容复制(深复制))
-
weak 的底层实现?
-
assign 和 weak、unsafe_unretained 具体有什么区别?
-
assgin是否可以用来修饰对象。
答:不能,只能修饰value type。不用ARC的类型。
答案尽在: 探究Objective-C属性关键字
2、Block
-
使用时要注意的地方
-
block的实现,如何截获自动变量的,如何修改自动变量的值的,block的几种形式
-
__block的本质
-
forwarding 指针
-
block怎么避免循环引用。是不是所有的block都会产生循环引用,
3、多线程
-
iOS 中多线程的几种方式,区别,使用场景,基本概念,并行和串行队列,同步和异步的区别。
-
GCD,写一个死锁:一篇专题让你秒懂GCD死锁问题!
1:死锁必然发生在串行队列
2:由于sync产生的死锁,sync操作所处的上下文环境队列 与 sync操作的目标队列是同一个队列 -
GCD怎么控制最大并发数 :
(dispatch_semaphore 信号量) -
NSOperationQueue 怎么控制最大并发数:(maxConcurrentOperationCount = 10)
-
怎么让子线程定时执行一个方法,具体的实现方法
-
如何控制线程的最大并发数为10,然后加载十个图片最后展示出来?
--> 具体方法 : 深入浅出 GCD 之 dispatch_group -
子线程的runloop是怎么执行的,它里面的 autoreleasepool 是怎么执行的。
-
NSMutableArray 怎么保证线程安全的。
1. dispatch_barrier_async
2. NSLock
4、Runtime
Objective-C Runtime Programming Guide
-
消息的动态转发
OC消息转发机制 -
给 Category 添加属性,关联对象都有几种形式
-
Category的实现原理,以及Category为什么只能加方法不能加属性?
答:分类的实现原理是将category中的方法,属性,协议数据放在category_t结构体中,然后将结构体内的方法列表拷贝到类对象的方法列表中。 Category可以添加属性,但是并不会自动生成成员变量及set/get方法。因为category_t结构体中并不存在成员变量。通过之前对对象的分析我们知道成员变量是存放在实例对象中的,并且编译的那一刻就已经决定好了。而分类是在运行时才去加载的。那么我们就无法再程序运行时将分类的成员变量中添加到实例对象的结构体中。因此分类中不可以添加成员变量
-
method swizzling
iOS开发 - runtime实践·方法交换(Method Swizzling) -
说一说类的结构,运行时中的class都有什么属性,property都有什么属性 ?
-
说一说isa指到NSObject的那个过程?
-
Category的本质,load方法什么时候加载,Category重写了父类的方***怎样,底层源码 ,如果两个Category和一个基类,都有同名方法,先执行哪个 ?
-
property会自动生成什么,如果此时已经有下划线_name的实例变量了那会生成什么
-
load 和 initialize 的区别和联系
从源码理解Category、load和initialize
load方法会在程序启动就会调用,当装载类信息的时候就会调用:优先调用类的load方法,之后调用分类的load方法。不过调用类的load方法之前会保证其父类已经调用过load方法。(程序启动 main()方法之前)
- +load方法调用顺序:
1. 一个类的+load方法在其父类的+load方法后调用
2. 一个Category的+load方法在被其扩展的类自由+load方法后调用.
3.当有多个类别(Category)都实现了load方法, 这几个load方法都会执行, 但执行顺序不确定(其执行顺序与类别在Compile Sources中出现的顺序一致)
- +initialize方法调用顺序:
1. 父类的initialize方法会比子类的initialize方法先执行
2. 当子类未实现initialize方法时, 会调用父类initialize方法.
子类实现initialize方法时, 会覆盖父类initialize方法.
3. 当有多个Category都实现了initialize方法, 会覆盖类中的方法,
只执行一个(会执行Compile Sources列表中最后一个Category的initialize方法)
initialize: 常用来初始化静态配置 static properties。
load: 常用来 Method swizzling。
4、Runloop
- runloop实现原理
struct __CFRunLoop {
CFRuntimeBase _base;
pthread_mutex_t _lock; /* locked **for** accessing mode list */
__CFPort _wakeUpPort; // used **for** CFRunLoopWakeUp 内核向该端口发送消息可以唤醒runloop
Boolean _unused;
volatile _per_run_data *_perRunData; // reset **for** runs of the run loop
pthread_t _pthread; //RunLoop对应的线程
uint32_t _winthread;
CFMutableSetRef _commonModes; //存储的是字符串,记录所有标记为common的mode
CFMutableSetRef _commonModeItems;//存储所有commonMode的item(source、timer、observer)
CFRunLoopModeRef _currentMode; //当前运行的mode
CFMutableSetRef _modes; //存储的是CFRunLoopModeRef
struct _block_item *_blocks_head;//doblocks的时候用到
struct _block_item *_blocks_tail;
CFTypeRef _counterpart;
};
- source 类型
Run Loop Source分为Source、Observer、Timer三种,他们统称为ModeItem。
- 线程保活的方式
EventLoop
-
runloop和多线程的关系,以及timer的关系
5、第三方库的源码
-
AFNetWorking, SDWebImage,YYModel 都是非常常见,基本面试必问
-
举例:SDWebImage怼源码,实现原理,eg:如果正在请求一个地址的图片,这个时候又同时另一个请求,这个时候会再发送一个请求吗?
-
如何自己实现一个 YYModel,具体使用的方法,延伸到 runtime 的源码
6、生命周期
-
app 的生命周期
iOS App生命周期理解 -
控制器的生命周期
iOS ViewController相关(创建、生命周期)
init —>
loadView —>
viewDidLoad —>
viewWillAppear —>
viewWillLayoutSubviews —>
viewDidLayoutSubviews —>
viewDidAppear —>
viewWillDisappear —>
viewDidDisappear
- 视图的生命周期
6、UI
-
UICollectionView 瀑布流
CollectionViewFlowLayout 五福UI线性布局 -
UITableView 相关的优化,底层原理等
-
页面布局
-
layoutSubViews 和 drawInRect 等的区别
-
自己实现一个 UIScrollView
bounds和panGestureRecognize就是实现UIScrollView滑动效果的关键技术点。
-
事件的传递链和响应链
-
界面非常卡顿怎么定位到具体的类和方法
-
UIView和CALayer区别
单一指责
7、数据存储
- 数据持久化都有什么,用过什么,归档,偏好设置都可以存储什么样的类型
8、架构
- MVC,MVVM等,他们的区别和联系,优缺点
- 从 0 到 1 实现一个 app 的思路
- 对于项目从 main 函数执行之前到之后启动优化,卡顿优化和界面优化。
9、OC 语言特性
- OC 与 C 的区别, OC 与 Java, C++ 的区别。
- iOS中的协议
- OC 动态性
- C语言如何动态的交换两个方法的实现
10、其他
- self.xx是调用的xx属性的get/set方法,而_xx则只是使用成员变量_xx,并不会调用get/set方法
- 两者的更深层次的区别在于,通过存取方法访问比直接访问多做了一些其他的事情(例如内存管理,复制值等)
-
KVO 的底层原理,自己实现
-
KVC 的底层原理,自己实现
-
NSNotificationCenter 的底层原理,是同步还是异步,如何实现一个,如果在子线程接收一个通知能不能接收到
-
几种页面传值方式的区别
-
界面非常卡顿怎么定位到具体的类和方法
-
一个 int 类型的值,被@ 包装成 NSNumber 类型,传递到一个接受 id 类型的方法参数中,这个值能不能保持正确
- 在 iPad 上面,分屏功能,拖拽 wps 的文件到qq的这个过程是怎么实现的?
UIDocumentInteractionController: 主要是用来实现同设备上app之间的共享文档,以及文档预览、打印、发邮件和复制等功能。它的使用非常简单。
首先通过调用它唯一的类方法 interactionControllerWithURL
:,并传入一个URL(NSURL)
,为你想要共享的文件来初始化一个实例对象。然后UIDocumentInteractionControllerDelegate
,然后显示菜单和预览窗口。
@IBAction func share(_ sender: UIBarButtonItem) {
documentInteractionController = UIDocumentInteractionController()
documentInteractionController.url = url
documentInteractionController.uti = url.uti
documentInteractionController.presentOptionsMenu(from: sender, animated: true)
}
进程间通信的方法 - iOS (APP)进程间8中常用通信方式总结
- 1 URL Scheme
- 2 Keychain
- 3 UIPasteboard
- 4 UIDocumentInteractionController
- 5 local socket
- 6 AirDrop
- 7 UIActivityViewController
- 8 App Groups
-
如何实现dispatch_once
-
Instrument 的使用
-
热修复用过么,平时版本是怎么迭代的,线上bug是怎么修复的
-
实习期的一些内容。
必备书单
- 图解 TCP/IP, 图解 HTTP
- 剑指offer
- Effective Objective-C
- iOS 与 OSX 高级编程
网友评论