- 50道iOS面试问答 - 3
- 1- What is Nil Coalescing & Ternary Operator? (nil合并和三元运算符是什么?)
- 2- What kind of JSONSerialization have ReadingOptions?
- 3- How can you prevent a user from doing said action more than once on their device?
- 4- What is DispatchGroup?
- 5- What is RGR ( Red — Green — Refactor)?
- 6- Where do we use Dependency Injection ?
- 7- Please explain types of notifications.
- 8- When is a good time for dependency injection in our projects?
- 9- What kind of order functions can we use on collection types ?
- 10- What allows you to combine your commits ?
- 11- What is the difference ANY and ANYOBJECT ?
- 12- Please explain SOAP and REST Basics differences ?
- 13- What is your favorite Visualize Chart library?
- 14- What is the difference Filter and Map Function?
- 15- What is CoreData ?
- 16- Could you explain Associatedtype ?
- 17- Which git command saves your code without making a commit ?
- 18- Explain Priority Inversion and Priority Inheritance. (解释优先级反转和优先级继承。)
- 19- What is Hashable?
- 20- When do you use optional chaining vs. if let or guard?
- 21- How many different ways to pass data in Swift ?
- 22- How do you follow up clean code for this project ?
- 23- Explain to using Class and Inheritance benefits
- 24- What’s the difference optional between nil and .None?
- 25- What is GraphQL ?
- 26- Explain Common features of Protocols & superclasses
- 27- What is Continuous Integration ?
- 28- What is the difference Delegates and Callbacks?
- 29- Explain Linked List
- 30- Do you know Back End development ?
- 31- Explain AutoLayout
- 32- What is the disadvantage to hard-coding log statements ? (硬编码日志语句的缺点是什么)
- 33- What is Pointer ?
- 34- Explain Core ML Pros and Cons (解释Core ML的优缺点)
- 35- What is pair programming?
- 36- Explain blocks
- 37- What is Keychain ?
- 38- What is the biggest changes in UserNotifications ? (UserNotifications最大的变化是什么?)
- 39- Explain the difference between atomic and nonatomic synthesized properties (解释原子和非原子合成属性的区别)
- 40- Why do we use availability attributes ? (为什么我们要使用可用性属性?)
- 41- How could we get device token ?
- 42- What is Encapsulation ?
- 43- What is big-o notation ? (什么是大O表示法?)
- 44- What Is Dependency Management? (什么是依赖管理?)
- 45- What is UML Class Diagrams?
- 46- Explain throw
- 47- What is Protocol Extensions?
- 48- What is three triggers for a local notification ?
- 49- Explain Selectors in ObjC
- 50- What is Remote Notifications attacment’s limits ?
50道iOS面试问答 - 3
1- What is Nil Coalescing & Ternary Operator? (nil合并和三元运算符是什么?)
它很容易返回一个未包装的可选值或默认值。如果我们没有一个值,我们可以设置0或默认值。
2- What kind of JSONSerialization have ReadingOptions?
-
mutableContainers指定数组和字典被创建为变量对象,而不是常量
-
mutableLeaves指定JSON对象图中的leaf strings作为变量String的实例创建。
-
allowFragments指定解析器应该允许非Array或Dictionary实例的顶级对象。
3- How can you prevent a user from doing said action more than once on their device?
苹果在iOS 10中引入了DeviceCheck。 这个API允许我们访问iOS设备中每个设备、每个开发者的数据。该解决方案比UserDefaults或广告标识符更好。DeviceCheck允许我们存储一个布尔值。
4- What is DispatchGroup?
DispatchGroup允许工作的聚合同步。我们可以使用它们来提交多个不同的工作项,并在它们全部完成时进行跟踪,即使它们可能在不同的队列上运行。当需要完成所有指定任务才能取得进展时,这种行为会很有帮助。
最基本的答案是:如果我们需要等待两个异步或同步操作才能继续,那么我们可以使用DispatchGroup。
5- What is RGR ( Red — Green — Refactor)?

红色、绿色和重构是TDD(测试驱动开发)的阶段。
- Red: 编写少量的测试代码(通常不超过7行代码),然后观察它是否失败。
- Green: 编写少量的产品代码。同样,通常不超过7行代码就可以使您的测试通过。
- Refactor: 测试正在通过,您可以进行更改而不必担心。清理代码。这里有很棒的研讨会笔记。
6- Where do we use Dependency Injection ?
我们在iOS应用中使用故事板或xib,然后创建IBOutlets。 IBOutlet是一个与视图相关的属性。它们在视图控制器被实例化时被注入到视图控制器中,这本质上是依赖注入的一种形式。
依赖注入有几种形式:构造函数注入、属性注入和方法注入。
7- Please explain types of notifications.
有两种类型的通知:远程和本地。 远程通知需要连接到服务器。本地通知不需要服务器连接。本地通知发生在设备上。
8- When is a good time for dependency injection in our projects?
这里有一些你可以遵循的指导方针。
- Rule 1. 可测试性对我们来说重要吗?如果是这样,那么在您希望测试的类中确定外部依赖关系是很重要的。 一旦可以注入依赖项,我们就可以很容易地将真实服务替换为模拟服务,从而使测试变得容易。
- Rules 2. 复杂的类具有复杂的依赖关系,包括应用程序级逻辑,或访问外部资源,如磁盘或网络。 应用程序中的大多数类都很复杂,包括几乎所有控制器对象和大多数模型对象。 最简单的开始方法是在应用程序中选择一个复杂的类,并查找在该类中初始化其他复杂对象的位置。
- Rules 3. 如果一个对象正在创建其他对象的实例,这些实例是其他对象中的共享依赖项,那么它是依赖项注入的一个很好的候选对象。
9- What kind of order functions can we use on collection types ?
- map(_😃: 在使用提供的闭包转换序列中的每个元素后返回一个结果数组。
- filter(_😃: 返回满足提供的闭包谓语的元素数组。
- reduce(:😃: 通过使用提供的闭包组合序列中的每个元素,返回单个值。
- sorted(by:): 返回基于提供的闭包谓语排序的序列中的元素的数组。
10- What allows you to combine your commits ?
git squash
11- What is the difference ANY and ANYOBJECT ?
Any可以表示任何类型的实例,包括函数类型和可选类型,基本数据类等。
AnyObject代表任何class类型的对象实例。
AnyObject是Any的子集
所有用class关键字定义的对象就是AnyObject
所有不是用class关键字定义的对象就不是AnyObject,而是Any
12- Please explain SOAP and REST Basics differences ?
它们都帮助我们访问Web服务。SOAP完全依赖XML来提供消息传递服务。 SOAP绝对是Web服务访问的重量级选择。最初由微软开发。
REST(具象状态传输)提供了一个轻量级的替代方案。 REST在许多情况下依赖于一个简单的URL,而不是使用XML来发出请求。REST可以使用四种不同的HTTP 1.1动词(GET、POST、PUT和DELETE)来执行任务。
13- What is your favorite Visualize Chart library?
-
Charts have support iOS,tvOS, OSX The Apple side of the cross-platform MPAndroidChart.
-
Core Plot is a 2D plotting framework for macOS, iOS, and tvOS
-
TEAChart has iOS support
14- What is the difference Filter and Map Function?
Map,我们传入一个函数来返回数组中每个元素的值。这个函数的返回值表示新数组中的元素。
我们传入一个函数,对每个元素返回true或false。 如果传递给给定元素的函数返回true,则该元素将包含在final数组中。
15- What is CoreData ?
Core data是一个对象图管理器,它还能够将对象图持久化到磁盘上的持久化存储中。 对象图就像一个典型的模型视图控制器iOS应用程序中所有不同模型对象的映射。 CoreData还集成了Core Spotlight。
但是Core Data不是线程安全的,这意味着,如果你在一个线程上加载一个托管对象,你不能把它传递给另一个线程并安全地使用它。当我们想要开始引入线程以提高性能时,这就成了一个问题,所以我们有两个选择。
第一个是将所有内容都放在主线程上,这意味着它是单线程的。第二种是在后台线程上做改变传递managedobjectid然后在主线程上再次加载这些对象,但这意味着你在主线程上,这让我们回到了开始的地方。 这两种情况都破坏了在Core Data中使用线程的意义,它们会给数据层增加很多复杂性。
还有另外一个选择,就是将托管对象转换为普通的旧Swift对象,或POSO。
16- Could you explain Associatedtype ?
如果你想创建通用协议,我们可以使用associatedtype。 要了解更多细节,请查看这个。
17- Which git command saves your code without making a commit ?
git stash
18- Explain Priority Inversion and Priority Inheritance. (解释优先级反转和优先级继承。)
如果高优先级线程等待低优先级线程,这称为优先级反转。如果低优先级线程暂时继承最高优先级线程的优先级,这称为优先级继承。
19- What is Hashable?
Hashable允许我们将对象用作字典中的键。 因此,我们可以创建自定义类型,使用hashValue比较它的相等性。
20- When do you use optional chaining vs. if let or guard?
当我们并不真正关心操作是否失败时,我们使用可选链接; 否则,我们使用if let或guard。可选链接让我们只在可选有值时运行代码。
像这样使用?操作符被称为可选链接。
苹果的文档是这样解释的:
可选链接是一个查询和调用当前可能为nil的可选对象的属性、方法和下标的过程。如果可选对象包含值,则属性、方法或下标调用成功;如果可选值为nil,则属性、方法或下标调用返回nil。多个查询可以被链接在一起,如果链中的任何链接为nil,那么整个链就会优雅地失败。
21- How many different ways to pass data in Swift ?
There are many different ways such as Delegate, KVO, Segue, and NSNotification, Target-Action, Callbacks.
22- How do you follow up clean code for this project ?
我遵循Github和SwiftLint的Swift项目的风格指南和编码约定。
23- Explain to using Class and Inheritance benefits
- 覆盖提供了一种自定义机制
- 重用的实现
- 子类化提供了重用接口
- 模块化
- 子类提供动态分派
24- What’s the difference optional between nil and .None?
没有差别;Optional.None (.None for short) 是初始化一个没有值的可选变量的正确方法, 而nil只是.none的语法糖。
25- What is GraphQL ?
GraphQL试图解决在应用程序级别为客户端创建查询接口的问题。Apollo iOS是一个强类型、缓存的iOS GraphQL客户端,用Swift编写。
26- Explain Common features of Protocols & superclasses
- 实现重用
- 提供定制点数
- 界面重用
- 通过对重用接口的动态调度支持模块化设计
27- What is Continuous Integration ?
持续集成允许我们在应用程序开发过程中出现问题时获得早期反馈。有很多可用的持续集成工具。
Self-hosted server:自托管服务器
- Xcode Server
- Jenkins
- TeamCity
Cloud solutions:云解决方案
- TravisCI
- Bitrise
- Buddybuild
28- What is the difference Delegates and Callbacks?
委托和回调之间的区别在于,对于委托,NetworkService会告诉委托“有什么变化了”。 通过回调,委托正在观察NetworkService。
29- Explain Linked List
链表基本上由我们命名为Node的结构组成。 这些节点基本上有两个东西。 第一个是我们想要保留的。 (我们不必保存单个数据,我们可以保留尽可能多的信息),另一个是另一个节点的地址信息。
链表的缺点是,在开始时,有额外的空间使用。 因为链表除了现有信息外,还有一个地址信息。这意味着更多的空间使用。
30- Do you know Back End development ?
我决定学习纯后端。你有两个选择。你可以学习node.js + express.js和mongodb。OR, you can learn Vapor or Kitura.
你不喜欢或使用Firebase吗?
31- Explain AutoLayout
AutoLayout提供了一个灵活而强大的布局系统,它描述了视图和UI控件如何计算层次结构中的大小和位置。
32- What is the disadvantage to hard-coding log statements ? (硬编码日志语句的缺点是什么)
首先,当您开始记录日志时。这开始积累。这可能看起来不多,但每一分钟都在积累。到项目结束时,这些零散的几分钟将等于几小时。
其次,每次我们向代码库中添加一个,我们就冒着在代码中注入新的bug的风险。
33- What is Pointer ?
指针是对内存地址的直接引用。变量作为一个值的透明容器,而指针删除了一个抽象层,让您看到该值是如何存储的。
34- Explain Core ML Pros and Cons (解释Core ML的优缺点)
Pros of Core ML:
-
很容易添加到你的应用中。
-
不仅适用于深度学习:逻辑回归、决策树和其他“经典”机器学习模型也适用。
-
附带一个方便的转换器工具,支持几种不同的培训包(Keras、Caffe、scikit-learn等)。
Cons:
Core ML只支持有限数量的模型类型。如果你训练的模型做一些Core ML不支持的事情,那么你就不能使用Core ML。
转换工具目前只支持少数几个培训包。一个值得注意的遗漏是TensorFlow,它可以说是最流行的机器学习工具。 您可以编写自己的转换器,但这不是新手的工作。 (TensorFlow不被支持的原因是它是一个用于制作通用计算图的低级包,而Core ML工作在更高的抽象级别。)
没有灵活性,没有控制力。Core ML API非常基础,它只允许你加载一个模型并运行它。 没有办法向模型中添加自定义代码。
仅支持iOS 11及以上版本。
35- What is pair programming?
结对编程是一种与初级开发人员共享信息的工具。 初级开发人员和高级开发人员并排坐在一起,这是初级开发人员向高级开发人员学习的最佳方式。
36- Explain blocks
block是一种定义单个任务或行为单元的方式,无需编写整个Objective-C类。 它们是匿名函数。
37- What is Keychain ?
Keychain是一个用于在iOS App中安全持久化数据的API。 它是安全的使用硬件模块,并备份到iCloud。
38- What is the biggest changes in UserNotifications ? (UserNotifications最大的变化是什么?)
- 我们可以添加音频、视频和图像。
- 我们可以为通知创建自定义接口。
- 我们可以使用通知中心中的接口来管理通知。
- 新的Notification扩展允许我们在远程通知有效负载被交付之前管理它们。
39- Explain the difference between atomic and nonatomic synthesized properties (解释原子和非原子合成属性的区别)
atomic : 这是默认行为。 如果一个对象被声明为原子的,那么它就变成了线程安全的。线程安全的意思是,每次该类的特定实例中只有一个线程可以控制该对象。
nonatomic: 它不是线程安全的。我们可以使用非原子属性来指定合成访问器直接设置或返回一个值,而不保证从不同线程同时访问相同的值会发生什么。因此,访问非原子属性要比访问原子属性快。
40- Why do we use availability attributes ? (为什么我们要使用可用性属性?)
苹果想要支持一个系统版本,这意味着我们应该支持iOS13或iOS14。 可用性属性让我们能够支持之前的iOS版本。
41- How could we get device token ?
获取设备令牌有两个步骤
首先,在可以注册远程通知之后,我们必须显示用户的权限屏幕。 如果这些步骤进展顺利,系统将提供设备令牌。如果我们卸载或重新安装应用程序,设备令牌将改变。
42- What is Encapsulation ?
封装是一种面向对象的设计原则,它隐藏了对象的内部状态和功能。 这意味着对象将其状态信息保持为私有。
43- What is big-o notation ? (什么是大O表示法?)
算法是用来确定输入N大小的工作时间的印象方法。大o表示法等级用最高值表示。
44- What Is Dependency Management? (什么是依赖管理?)
如果我们想集成开源项目,添加一个来自第三方项目的框架,甚至在我们自己的项目中重用代码,依赖关系管理帮助我们管理这些关系。
45- What is UML Class Diagrams?
UML类图是一组用于软件系统规范的规则和符号,由对象管理组管理和创建。
46- Explain throw
通过使用throws关键字,我们告诉编译器它可以抛出错误。 在抛出错误之前,我们需要列出想要抛出的所有可能错误。
47- What is Protocol Extensions?
我们可以采用使用扩展的协议,也可以采用原始类型声明的协议。 这允许您将协议添加到您不一定拥有的类型中。
48- What is three triggers for a local notification ?
Location, Calendar, and Time Interval.
当你手机上的GPS定位在某个位置或地理区域时,就会触发Location通知。
日历触发器基于分解为日期组件的日历数据。
时间间隔是计时器停止前的秒数。
49- Explain Selectors in ObjC
选择器是Objective-C方法名的内部表示。
50- What is Remote Notifications attacment’s limits ?
我们可以通过推送通知发送视频或图像。但是最大有效载荷是4kb。如果我们想发送高质量的附件,我们应该使用通知服务扩展。