引言
过年之后相信有一部分的人,早已磨刀霍霍向大厂。势必要大展拳脚,必将在大厂内创出一片天地。但是,想必大家都知道:最近几年的最严重的互联网寒冬来临,各位兄弟都会说“江湖再见”。耳边总是充刺着流言蜚语,这个地方裁员了,这个地方缩减 HC。弄得人心慌慌。年后将是一片血雨腥风,程序界的江湖将在这一天精彩斑斓。
但我们要知道,寒冬之中,什么是最珍贵,就让鄙人告诉你:人才。只要有过硬的技术和装备,在逆风直下的情况下,咱们也能迎难而上,打他个戳手不及。不是“李云龙”大哥说:“过狭路相逢勇者胜.”
最近几天看了朋友,到处厮杀,经过一番斗争,最终夺下头筹获得多家大厂的 offer。
承蒙兄弟抬爱,感情深厚。拿出《iOS 中高级面试宝典》赠与小弟参悟。经过小弟我的反复参悟和整理,现在共享出来,希望与大家一起学习参悟。小弟我先说一下,面试虽然有技巧,但咋们绝不是吹嘘与伪造之辈,因先当花点时间静心闭关修炼,带到出关之日,必进大厂,薪资翻倍,岂不快哉!!!
参悟规则
作为一名优秀的程序员,肯定是不会浪费时间在一个:
一:没有晋升,没有职业发展的公司
二:也不会停留在某一个技术层面不前进的公司
三:我愿付出真心,你却不愿有待我的公司
本博客的知识点较多,花点时间一个个理解并记忆后,自然也就融会贯通,无所畏惧。面试 iOS 也就分分钟
本宝典为了便于记忆,快速达到应试状态,类似于复习知识大纲。知识点会尽量的精简与提炼知识脉络,并不去展开深入细节,面面俱到。有兴趣或者有疑问的兄弟可以自行谷歌下对应知识点的详细内容。
作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的 iOS 交流群:761407670 进群密码‘思否’,不管你是小白还是大牛欢迎入驻,分享 BAT, 阿里面试题、面试经验,讨论技术,大家一起交流学习成长!
1、swift 和 oc 的区别
(1) Swit 没有地址指针的概念
(2)泛型
(3)类型严谨对比 oc 的动态绑定
2、编译连接
-
id
和instancetype
的区别 -
instancetype
只能故返回值编译时判断真实类型, 不符合发警告 - 特殊情况: 关联类型返回方法如类方法
lloc
或new
开头实例方法中, 以 autorelease,init,retain, 或self
开头
3、synthesize & denamic
1: 通过 @sythesize
指令告诉编译器在编译期间产生 getter/setter 方法。
2: 通过 @dynamic 指令,自己实现方法。
有些存取是在运行时动态创建的,如在 CoreData
的NSManagedObject
类使
4、在项目开发中常用的开发工具有哪些?
- instrument
- beyondCompare
- git
5、UlTableView & UlCollection
- UlCollectionView 是 iOS6 新引进的
API
, 用于展示集合视图,布局更加灵活,其用法类似于UITableView
。 - 而 UICollectionView、UlCollectionViewCell 与 UITableView、UITableViewCell 在用法上有相似的也有不同的,
下面是一些基本的使用方法: 对 UITableView, 仅需要 UITableViewDataSource,UITableViewDelegate 这两个协议 - 使用 UlCollectionView 需要实现:UICollectionViewDataSource,UlCollectionViewDelegate,
UlCollectionViewDelegateFlowLayout 这三个协议. - 这是因为 UlCollectionViewDelegateFlowL ayou 实际上是 UCollectionViewDelegate 的一个子协议,它继承了
UlCollectionViewDelegate, 它的作用是提供一些定义 UlCollectionView 布局模式的函数
6、NSProxy & NSObject
NSObjetct:
- NSObject 协议组对所有的
Object -C
下的objects
都生效。如果objects
遵从该协议,就会波看作是 first -class
objects (- 级类)。另外,遵从该协议的objects
的 retain, release, autorelease 等 方法也服从objects
的管理和在
Foundation 中定义的释放方法。- - 些容器中的对象也可以管理这些 - objects, 比如说
NSArray
和NSDictionary
定义的对象。Cocoa 的根类也遵循该协议,所以所有继承 NSObjects 的
objects 都有遵循该协议的特性。 -
NSProXY:NSProxy
是一个虚基类,它为一些表现的像是其它对象替身或者并不存在的对象定义一套API
。- 般
的,发送给代理的消息被转发给一个真实的对象或者代理本身 load(或者将本身转换成)一个真实的对象。 -
NSProxy
的基类可以被用来透明的转发消息或者耗费巨大的对象的lazy
初始化。
7、Object & Swift
-
Obejective-C
复杂的语法,更加简单易用、有未来,让许多开发者心动不已. - 苹果宣称 Swift 的特点是: 快速、现代、安全、互动,而且明显优于
Objective-C
语言
可以使用现有的 Cocoa 和 Cocoa Touch 框架
Swift 取消了Objective C
的指针及其他不安全访问的使用 - 舍弃
Objective C
早期应用 Smalltalk 的语法,全面改为句点表示法提供了类似 Java 的名字空间 (namespace)、
泛型 (generic)、运算对象重载(operator overloading) Swift 被简单的形容为“没有 C 的Objective-C
”(Objective- C without theC)
为苹果开发工具带来了 Xcode - Playgrounds 功能,该功能提供强大的互动效果,能让 Swift 源代码在撰写过程中实时显示出其运行结果;
基于 C 和Objective-C
, 而却没有 C 的一些兼容约束; 采用了安全的编程模式; 界面基于 Cocoa 和 Cocoa Touch 框架; 保留 Smaltalk 的动态特性
8、传值通知 & 推送通知(本地 & 远程)
传值通知: 类似通知,代理,Block 实现值得传递
推送通知: 推送到用户手机对应的 App 上 (主要是不再前台的情况) 本地通知。
local notfication
, 用于基于时间行为的通知,比如有关日历或者 todo 列表的小应用。另外,应用如果在后台执
行,iOS 允许它在受限的时间内运行,它也会发现本地通知有用。比如,一个应用,在后台运行,向应用的服
务器端获取消息,当消息到达时,比如下载更新版本的提示消息,通过本地通知机制通知用户。
本地通知是 UILocalNotification
的实例,主要有三类属性:
scheduled time
, 时间周期,用来指定 iOS 系统发送通知的 8 期和时间; ntilication type
, 通知类型,包括警告信息、动作按钮的标题、应用图标上的 badge (数字标记)和播放的声音:
自定义数据,本地通知可以包含一个 dictionary 类型的本地数据。
对本地通知的数量限制,iOS 最 多允许最近本地通知数量是 64 个,超过限制的本地通知将被 iOS 忽略。远程通知 (需要服务器)
流程大概是这样的
1. 生成 CerticateSigningRequest. certSigningRequest 文件
2. 将 CertilicateSigningRequest.certSigningRequest 上传进 developer, 导出.cer 文件
3. 利用 CSR 导出 P12 文件
4. 需要准备下设备 token 值(无空格)
5. 使用 OpenSSL 合成服务器所使用的推送证书
一般使用极光推送,步骤是一样的,只是我们使用的服务器是极光的,不需要自己大服务器!
9、第三方库 & 第三方平台
第三方库:
一般是指大牛封装好的一一个框架 (库),或者第三方给我们提供的一个库,这里比较笼统 * 第三方平
台: 指第三方提供的 - 些服务,其实很多方面跟第三方库是一样的,但是还是存在一些区别。
区别: 库: AFN, ASI, Alomofire, MJRefresh, MJExtension, MBProgressHUD 平台: 极光,百度,友盟,Mob, 环信
imageName 和 mageWithContextOfFile 的区别? 哪个性能高
(1)用 imageNamed
的方式加载时,图片使用完毕后缓存到内存中,内存消耗多,加载速度快。即使生成的
对象被 autoReleasePool
释放了,这份缓存也不释放,如果图像比较大,或者图像比较多,用这种方式会消耗
很大的内存。
imageNamed 采用了缓存机制,如果缓存中已加载了图片,直接从缓存读就行了,每次就不用再去读文件了,
效率会更高。
(2) ImageWithContextOfile 加载,图片是不会缓存的,加载速度慢。
(3)大量使用 imageNamed
方式会在不需要缓存的地方额外增加开销 CPU 的时间当应用程字需要加载 - - 张比较
大的图片并且使用一次性,那么其实是没有必要去缓存这个图片的,用 imageWithContentsOfile
是 最为经济
的方式,这样不会因为 Ullmage 元素较多情况下,CPU 会被逐个分散在不必要缓存上浪费过多时间
10、NSCache & NSDcitionary
NSCache 与可变集合有几点不同:
NSCache 类结合了各种自动删除策略,以确保不会占用过多的系统内存。如果其它应用需要内存时,系统自
动执行这些策略。当调用这些策略时,会从缓存中删除一些对象,以最大限度减少内存的占用。
-
NSCache
是线程安全的,我们可以在不同的线程中添加、删除和查询缓存中的对象,而不需要锁定缓存区域。 - 不像
NSMutableDictionary
对象,- 一个缓存对象不会拷贝 key 对象。 -
NSCache
和NSDictionary
类似,不同的是系统回收内存的时候它会自动删掉它的内容。
(1)可以存储(当然是使用内存)
(2)保持强应用,无视垃圾回收. => 这 - 点同 NSMutableDictionary(3)有固定客户.
11、UlView 的 setNeedsDisplay 和 setNeedsLayout 方法
- 在
Mac OS
中NSWindow
的父类是NSResponder
, 而在iOS
中UIWindow
的父类是UIVIew
。程序一般只有一一个窗口但是会又很多视图 - UlView 的作用: 描画和动画,视图负责对其所属的矩形区域描画、布局和子视图管理、事件处理、可以接收触摸事件、事件信息的载体、等等。
-
UIViewController
负责创建其管理的视图及在低内存的时候将他们从内存中移除。还为标准的系统行为进行响应。 -
layOutSubViews
可以在自己定制的视图中重载这个方法,用来调整子视图的尺寸和位置。 -
UIView
的setNeedsDisplay
(需 要重新显示,绘制和setNeedsLayout
(需要重新布局) 方法。首先两个方法都是异步执行的。而setNeedsDisplay
会调用自动调用drawRect
方法,这样可以拿到UIGraphicsGetCurrentContext
, 就可以画画了。而setNeedslayout
会默认调用layoutSubViews
, 就可以处理子视图中的一些数据。
综上所述 setNeedsDisplay
方便绘图,而 layoutSubViews
方便出来数据 setNeedDisplay
告知视图它发生了改变, 需要重新绘制自身,就相当于刷新界面
12、UILayer & UiView
-
UlView
是 iOS 系统中界面元素的基础,所有的界面元素都继承自它。它本身完全是由CoreAnimation
来实现的 (Mac 下似乎不是这样)。它真正的绘图部分,是由一个叫 CAL ayer (Core Animation Layer) 的类来管理。UIView 本身,更像是 - 个 CAL ayer 的管理器,访问它的跟绘图和跟坐标有关的属性,例如 frame, bounds 等等,实际 上内部都是在访问它所包含的CAL ayer
的相关属性。 -
UIView
有个重要属性layer
, 可以返回它的主CAL ayer
实例。 -
UIView
的CAL ayer
类似UIView
的子View
树形结构,也可以向它的layer
上添加子layer
, 来完成某些特殊的表示。即 CALayer 层是可以嵌套的。 -
UIView
的ayer
树形在系统内部,被维护着三份 opy。分别是逻辑树,这里是代码可以操纵的; 动画树,是一个中间层,系统就在这一层上更改属性,进行各种渲染操作; 显示树,其内容就是当前正被显示在屏幕上得内容。
动画的运作: 对 UMiew
的 sublayer(非主 Layer)属性进行更改,系统将自动进行动画生成,动画持续时间的缺省值似乎是 0.5 秒。
坐标系统: CAL ayer
的坐标系统比 UIView
多了 - 个 anchorPoint
属性, 使用 CGPoint
结构表示,值域是 0~1, 是个比例值。
渲染: 当更新层,改变不能立即显示在屏幕上。当所有的层都准备好时,可以调用 setNeedsDisplay
方法来重绘显示。
变换: 要在一个层中添加 - - 个 3D 或仿射变换,可以分别设置层的 transform
或fineTranstorm
属性。
变形: Quartz Core
的渲染能力,使二维图像可以被自由操纵,就好像是三维的。图像可以在一个三维坐标系中以任意角度被旋转,缩放和倾斜。CATranstform3D
的一套方法提供了一些魔术般的变换效果。
13、layoutSubViews & drawRects
layoutSubviews 在以下情况下会波调用(视图位置变化是触发):
1、init 初始化不会触发 layoutSubviews。2、addSubview 会触发 layoutSubviews。3、设置 Vview 的 Frame 会触发 layoutSubviews, 当然前提是 frame 的值设置前后发生了变化。4、滚动一个 UISCrollView 会触发 layoutSubviews。5、旋转 Screen 会触发父 UIView 上的 layoutSubviews 事件。6、改变一个 UIView 大小的时候也会触发父 UIView 上的 layoutSubviews 事件。7、直接调用 setLayoutSubviews。
drawRect 在以下情况下会被调用:
1、如果在 UIView
初始化时没有设置 rect
大小,将直接导致 drawRect
不被自动调用。drawRect
掉用是在 Controller->loadView,Controller->viewDidLoad 两方法之后掉用的. 所以不用担心在控制器中,这些 View 的 drawRect
就开始画了. 这样可以在控制器中设置 - 些值给View
(如果这些 View draw 的时候需要用到某些变量值).
2、该方法在调用 sizeToFit
后被调用,所以可以先调用 sizeToFt
计算出 size
。然后系统自动调用drawRect:
方法。
3、通过设置 contentMode
属性直为 UIViewContentModeRedraw
。那么将在每次设置或更改rame
的时候自动调用dr awRect
。
4、直接调用 setNeedsDisplay
, 或者setNeedsDisplaylnRect
: 触发drawRect,
但是有个前提条件是 rect
不能为0
。
drawRect 方法使用注意点:
1、若使用 UIView 绘图,只能在 drawRect: 方法中获取相应的 contextRef
并绘图。如果在其他方法中获取将获取到一个 invalidate
的ref
并且不能用于画图。
drawRect: 方法不能手动显示调用,必须通过调用 setNeedsDisplay
或者setNeedsDisplaynRect
, 让系统自动调该方法。
2、若使用 calayer
绘图,只能在 drawInContext: 中 (类 似鱼 drawRect) 绘制,或者在 delegate
中的相应方法绘制。同样也是调用 setNeedDisplay
等间接调用以上方法
3、若要实时画图,不能使 HgestureRecognizer
, 只能使用touchbegan
等方法来掉用 setNeedsDisplay
实时刷新屏幕
14、UDID & UUID
UDID 是 Unique Device ldentifer的缩写中文意思是设备唯一标识
在很多需要限制一台设备一个账号的应用中经常会用到,在 Symbian 时代, 我们是使用 IMEI 作为设备的唯一标识的, 可惜的是 Apple 官方不允许开发者获得设备的 IMEI.
lUlDevice currentDevicel uniqueldentie]
但是我们需要注意的一点是, 对于已越狱了的设备,UDID
并不是唯一的 使用 Cydia
插件 UDIDFaker
, 可以为每一个应用分配不同的UDID
. 所以UDID
作为标识唯一设备的用途已经不大了。
UUID
是 Universally Unique ldentifier 的缩写,中文意思是通用唯一识别码由网上资料显示,UUID 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation,OSF) 的组织在分布式计算环境 (DistributedComputing Enviroment,DCE) 领域的一部份.UUID 的目的, 是 让分布式系统中的所有元素都能有唯一的辨识资讯, 而不需要透过中央控制端来做辨识资讯的指定。
15、CPU & GPU
CPU: 中央处理器 (英 文 Central ProcessingUnit) 是一台计算机的运算核心和控制核心。CPU、内部存储器和输入输出设备是电子计算机三大核心部件。其功能主要是解释计算机指令以及处理计算机软件中的数据。
GPU: 英文全称 Graphic Processing Unit, 中文翻译为“图形处理器”。一个专门的图形核心处理器。GPU 是显示卡的“大脑”,决定了该显卡的档次和大部分性能,同时也是 2D 显示卡和 3D 显示卡的区别依据。2D 显示芯片在处理 3D 图像和特效时主要依赖 CPU 的处理能力,称为“软加速”。3D 显示芯片是将三维图像和特效处理功能集中在显示芯片内,也即所谓的 ” 硬件加速 ” 功能
结语
由于宝典内容过多,我就不一一介绍,就先写到这里的吧!大家不用着急慢慢来。给大家看看目录吧!
每个大厂的面试并不是很容易对付,很多的技术领域并没有真正的答案,看自己能给出让人满意的回答,最终还靠自己去实践、研究。知识方面的深度与广度都该在同一条路上,升华自己。如不嫌弃小编个大家推荐一个我的 iOS 交流群:761407670 进群密码‘思否’,进群可以在群文件里面获取这篇面试题的全部答案,学习资料,iOS 相关方面的电子书。群里纯技术交流!