61

中高级iOS大厂面试宝典,拿到offer率80%,金三银四将是你的新起点

 5 years ago
source link: http://www.cocoachina.com/ios/20190218/26350.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

引言

过年之后相信有一部分的人,早已磨刀霍霍向大厂。势必要大展拳脚,必将在大厂内创出一片天地。但是,想必大家都知道:最近几年的最严重的互联网寒冬来临,各位兄弟都会说“江湖再见”。耳边总是充刺着流言蜚语,这个地方裁员了,这个地方缩减HC。弄得人心慌慌。年后将是一片血雨腥风,程序界的江湖将在这一天精彩斑斓。

但我们要知道,寒冬之中,什么是最珍贵,就让鄙人告诉你:人才。只要有过硬的技术和装备,在逆风直下的情况下,咱们也能迎难而上,打他个戳手不及。不是“李云龙”大哥说:“过狭路相逢勇者胜.”

最近几天看了朋友,到处厮杀,经过一番斗争,最终夺下头筹获得多家大厂的offer。

承蒙兄弟抬爱,感情深厚。拿出《iOS中高级面试宝典》赠与小弟参悟。经过小弟我的反复参悟和整理,现在共享出来,希望与大家一起学习参悟。小弟我先说一下,面试虽然有技巧,但咋们绝不是吹嘘与伪造之辈,因先当花点时间静心闭关修炼,带到出关之日,必进大厂,薪资翻倍,岂不快哉!!!

参悟规则

作为一名优秀的程序员,肯定是不会浪费时间在一个 :

一:没有晋升,没有职业发展的公司

二:也不会停留在某一个技术层面不前进的公司

三:我愿付出真心,你却不愿有待我的公司

本博客的知识点较多,花点时间一个个理解并记忆后,自然也就融会贯通,无所畏惧。面试iOS也就分分钟

本宝典为了便于记忆,快速达到应试状态,类似于复习知识大纲。知识点会尽量的精简与提炼知识脉络,并不去展开深入细节,面面俱到。有兴趣或者有疑问的兄弟可以自行谷歌下对应知识点的详细内容。

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显示芯片是将三维图像和特效处理功能集中在显示芯片内,也即所谓的"硬件加速"功能

结语

由于宝典内容过多,我就不一一介绍,就先写到这里的吧!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK