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)?

avatar

红色、绿色和重构是TDD(测试驱动开发)的阶段。

  1. Red: 编写少量的测试代码(通常不超过7行代码),然后观察它是否失败。
  2. Green: 编写少量的产品代码。同样,通常不超过7行代码就可以使您的测试通过。
  3. 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

charts资源

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。如果我们想发送高质量的附件,我们应该使用通知服务扩展。