50 iOS面试问答第3部分

您好,第3部分已准备就绪! 如果还没有,请查看第1部分第2部分

更新:2018年12月27日。

1-什么是Nil合并和三元运算符?

它很容易返回未包装的可选值或默认值。 如果没有值,则可以设置零或默认值。

2-什么样的JSONSerialization有ReadingOptions?

  • mutableContainers指定将数组和字典创建为变量对象,而不是常量。
  • mutableLeaves指定将JSON对象图中的叶字符串创建为变量String的实例。
  • allowFragments指定解析器应允许不是Array或Dictionary实例的顶级对象。

3-如何防止用户在其设备上多次执行上述操作?

苹果在iOS 10中引入了DeviceCheck。该API使我们可以访问iOS设备中按设备,按开发人员的数据。 该解决方案比UserDefaults或Advertising Identifier更好。 DeviceCheck允许我们存储一个布尔值。

4-什么是DispatchGroup?

DispatchGroup 允许工作的聚合同步。 我们可以使用它们来提交多个不同的工作项,并跟踪它们的完成时间,即使它们可能在不同的队列中运行。 如果在完成所有指定任务之前无法取得进展,此行为将很有帮助。 Apple的文档

最基本的答案:如果在继续之前需要等待几个异步或同步操作,则可以使用DispatchGroup.

5-什么是RGR(红色-绿色-重构)?

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

  1. 红色:编写少量测试代码,通常不超过七行代码,然后观察失败。
  2. 绿色:编写少量生产代码。 同样,通常不超过七行代码,即可通过测试。
  3. 重构:测试通过了,您可以进行更改而不必担心。 清理您的代码。 这里有很多讲习班笔记。

6-我们在哪里使用依赖注入?

我们在iOS应用中使用情节提要或xib,然后创建了IBOutlets。 IBOutlet是与视图相关的属性。 这些在实例化时被注入到视图控制器中,这实质上是依赖注入的一种形式。

依赖注入有多种形式:构造函数注入,属性注入和方法注入。

7-请说明通知类型。

通知有两种类型:远程和本地。 远程通知需要连接到服务器。 本地通知不需要服务器连接。 本地通知会在设备上发生。

8-什么时候是我们项目中依赖注入的好时机?

您可以遵循一些准则。

规则1.可测试性对我们重要吗? 如果是这样,则必须在要测试的类中标识外部依赖项。 一旦注入依赖关系,我们就可以轻松地将真实服务替换为模拟服务,从而使其易于测试。

规则2.复杂的类具有复杂的依赖关系,包括应用程序级逻辑,或访问外部资源,例如磁盘或网络。 应用程序中的大多数类将很复杂,包括几乎所有控制器对象和大多数模型对象。 最简单的入门方法是在应用程序中选择一个复杂的类,然后在该类中查找用于初始化其他复杂对象的位置。

规则3.如果一个对象正在创建其他对象的实例,这些实例在其他对象内是共享的依赖关系,那么它就很适合进行依赖关系注入。

9-我们可以在集合类型上使用哪种订购功能?

  • map(_:) :使用提供的闭包转换序列中的每个元素后,返回结果数组。
  • filter(_:) :返回满足提供的闭包谓词的元素数组。
  • reduce(_:_:) :使用提供的闭包,通过组合序列中的每个元素来返回单个值。
  • sorted(by:) :返回基于提供的闭包谓词排序的元素数组。

要查看Sequence可用的所有方法,请查看Sequence文档。

10-什么允许您合并提交?

git squash

11- ANY和ANYOBJECT有什么区别?

根据Apple的Swift文档:

  • Any 可以代表任何类型的实例,包括函数类型和可选类型。
  • AnyObject 可以代表任何类类型的实例。

查看更多详细信息。

12-请解释SOAP和REST基础的区别?

它们都可以帮助我们访问Web服务。 SOAP仅依靠XML来提供消息传递服务。 SOAP绝对是Web服务访问的重要选择。 最初由Microsoft开发。

REST (代表性状态转移)提供了更轻巧的选择。 在许多情况下,REST都不使用XML发出请求,而是依靠简单的URL。 REST可以使用四个不同的HTTP 1.1动词(GET,POST,PUT和DELETE)来执行任务。

13-您最喜欢的Visualize Chart库是什么?

图表支持iOS,tvOS,OSX跨平台MPAndroidChart的Apple端。

Core Plot是适用于macOS,iOS和tvOS的2D绘图框架

茶图 有iOS支持

精选的iOS图表库的精选列表,包括Objective-C和Swift

14-过滤和映射功能有什么区别?

Map,我们传入一个函数,该函数为数组中的每个元素返回一个值。 该函数的返回值表示元素在我们的新数组中变成什么。

过滤器,我们传入一个为每个元素返回true或false的函数。 如果我们传递的函数对于给定元素返回true,则该元素将包含在最终数组中。

15-什么是CoreData?

核心数据是一个对象图管理器,它还具有将对象图持久化到磁盘上的持久性存储中的能力。 对象图就像典型的模型视图控制器iOS应用程序中所有不同模型对象的映射。 CoreData还与Core Spotlight集成。

但是Core Data不是线程安全的,这意味着,如果在一个线程上加载托管对象,则不能将其传递给另一个线程并安全地使用它。 当我们要开始引入线程以提高性能时,这成为一个问题,因此我们有两种选择。

首先是将所有内容保留在主线程上,这仅意味着它是单线程的。 或第二种方法是在后台线程上进行更改并传递托管对象ID,然后将这些对象再次加载到主线程上,但这意味着您在主线程上,这使我们回到了开始的位置。 这两种方式都破坏了在Core Data中使用线程的意义,并且它们都可以为数据层增加很多复杂性。

还有另一个选择,它将托管对象转换为普通的旧Swift对象或POSO。

16-您能解释一下Associatedtype吗?

如果要创建通用协议,我们可以使用associatedtype。 有关更多详细信息,请查看此。

17-哪个git命令保存代码而不提交?

git stash

18-解释 优先级倒置 优先级继承

如果高优先级线程等待低优先级线程,则称为优先级倒置。 如果低优先级线程临时继承最高优先级线程的优先级,则称为Priority Inheritance

19-什么是哈希?

哈希允许我们将对象用作字典中的键。 因此,我们可以使用hashValue来进行自定义类型的相等性比较

20-什么时候使用可选的链接,而使用let或guard?

当我们不太在乎操作是否失败时,可以使用可选链接。 否则,我们使用if letguard 。 可选链接使我们仅在可选值具有值时才运行代码。

像这样使用问号运算符称为可选链接。 Apple的文档是这样解释的:

可选链接是一个查询和调用当前可能为零的可选属性,方法和下标的过程。 如果可选包含值,则属性,方法或下标调用成功;否则,调用成功。 如果可选值为nil,则属性,方法或下标调用将返回nil。 可以将多个查询链接在一起,如果链中的任何链接为nil,则整个链都会正常失败。

21-在Swift中有多少种不同的方式来传递数据?

有很多不同的方式,例如代理,KVO,Segue和NSNotification,目标操作,回调。

22-您如何跟踪该项目的干净代码?

我遵循Github和SwiftLint的Swift项目的样式指南和编码约定。

23-解释使用类和继承的好处

  • 使用覆盖提供自定义机制
  • 重用实现
  • 子类化提供重用接口
  • 模块化
  • 子类提供动态调度

24- nil .None 之间的可选 .None 什么?

没有区别。 Optional.None (简称.None )是初始化缺少值的可选变量的正确方法,而nil只是.None语法糖。 看一下这个。

25-什么是GraphQL?

GraphQL试图解决在应用程序级别为客户端创建查询接口的问题。 Apollo iOS是使用Swift编写的用于iOS的强类型缓存GraphQL客户端。

26-解释协议和超类的共同特征

  • 实现重用
  • 提供定制点
  • 接口重用
  • 通过动态分配重用接口来支持模块化设计

27-什么是 持续集成

持续集成使我们能够在应用程序开发中出现问题时及早获得反馈。 有很多可用的持续集成工具。

自托管服务器

  • Xcode服务器
  • 詹金斯
  • 团队城市

云解决方案

  • TravisCI
  • 比特升
  • Buddybuild

28-代表和回调有什么区别?

委托与回调之间的区别在于,对于委托,NetworkService告诉委托“有一些变化”。对于回调,委托正在观察NetworkService。

看一下这个。

29-说明链接列表

链表基本上由我们称为节点的结构组成。 这些节点基本上有两件事。 第一个是我们要保留的。 (我们不必保存单个数据,我们可以保留所需的尽可能多的信息),另一个是另一个节点的地址信息。

链表的缺点一开始就是多余的空间使用。 因为链表除了现有信息外还具有地址信息。 这意味着更多的空间使用。

30-您知道后端开发吗?

要看。 我经历过PARSE,并获得FBStart。 我决定学习纯后端。 您有两种选择。 您可以学习node.js + express.js和mongodb。 或者,您可以学习VaporKitura

您不喜欢或使用Firebase吗?

  Firebase没有适用于macOS X开发人员的路径。 

如果您想学习Firebase,请仅学习一个月的Firebase Google网上论坛。

31-解释自动版式

AutoLayout提供了灵活而强大的布局系统,该系统描述视图和UI控件如何计算层次结构中的大小和位置。

32-硬编码日志语句的缺点是什么?

首先 ,当您开始登录时。 这开始积累。 看起来似乎不多,但每一分钟都会加起来。 到项目结束时,这些杂散的分钟数将等于几个小时。

其次 ,每次在代码库中添加一个代码时,都会冒将新错误注入代码的风险。

33-什么是指针?

指针是对内存地址的直接引用。 变量充当值的透明容器,而指针则删除了抽象层,并让您了解了该值的存储方式。

34-说明核心ML的利与弊

Core ML的优点:

  • 真的很容易添加到您的应用程序中。
  • 不仅用于深度学习:逻辑回归,决策树和其他“经典”机器学习模型也都适用。
  • 随附一个方便的转换器工具,该工具支持几种不同的培训包(Keras,Caffe,scikit-learn等)。

缺点

  • Core ML仅支持有限数量的模型类型。 如果您训练的模型执行Core ML不支持的功能,那么您将无法使用Core ML。
  • 转换工具目前仅支持一些培训包。 一个明显的遗漏是TensorFlow,可以说是最流行的机器学习工具。 您可以编写自己的转换器,但是对于新手而言,这不是工作。 (不支持TensorFlow的原因是,它是用于制作通用计算图的低级软件包,而Core ML在更高的抽象级别上工作。)
  • 没有灵活性,很少控制。 Core ML API非常基础,它仅允许您加载模型并运行它。 无法将自定义代码添加到模型中。
  • 仅适用于iOS 11和更高版本。

了解更多信息。

35-什么是结对编程?

结对编程是一种与初级开发人员共享信息的工具。 初级和高级开发人员并排坐着,这是大三向高级开发人员学习的最佳方法。

查阅Martin Fowler的WikiHow关于“配对编程的误解”,关于配对编程

36-解释块

是一种定义单个任务或行为单元的方式,而无需编写整个Objective-C类。 它们是匿名函数。

37-什么是钥匙串?

钥匙串是一种用于将数据安全存储在iOS App中的API。 有一个很好的图书馆– 锁匠

38- UserNotifications中最大的变化是什么?

  • 我们可以添加音频,视频和图像。
  • 我们可以为通知创建自定义界面。
  • 我们可以通过通知中心中的界面管理通知。
  • 新的通知扩展允许我们在交付远程通知有效负载之前对其进行管理。

39-解释原子和非原子合成特性之间的区别

atomic:这是默认行为。 如果一个对象被声明为原子对象,那么它将成为线程安全的。 线程安全意味着,一次该类的特定实例的一个线程只能控制该对象。

非原子的:它不是线程安全的。 我们可以使用nonatomic属性来指定合成访问器直接设置或直接返回一个值,而不保证如果从不同线程同时访问同一值会发生什么情况。 因此,访问非原子属性比原子属性要快。

40-为什么我们使用 可用性 属性?

苹果希望支持一个系统版本 ,这意味着我们应该支持iOS9或iOS8。 可用性属性使我们能够支持早期版本的iOS。

41-我们如何获得设备令牌?

获取设备令牌有两个步骤。 首先,在我们可以注册远程通知之后,必须显示用户的权限屏幕。 如果这些步骤执行顺利,系统将提供设备令牌。 如果我们卸载或重新安装该应用程序,则设备令牌将更改。

42-什么是封装?

封装是一种面向对象的设计原理,它隐藏了对象的内部状态和功能。 这意味着对象将其状态信息保密。

43-什么是big-o表示法?

算法是一种印象方法,用于确定输入N大小的工作时间。 big-o记号等级由最高值表示。 big-o表示法是用O(n)问题来寻找答案。 这是备忘单 快速算法俱乐部 例如;

对于循环,大o表示法为O(N)。 因为For循环工作n次。

变量(var number:Int = 4)big-o表示法是O(1)。

44-什么是依赖管理?

如果我们要集成开源项目,从第三方项目添加框架,甚至在我们自己的项目中重用代码,则依赖管理可以帮助我们管理这些关系。 看一下这个

45-什么是UML类图?

UML类图是由对象管理组管理和创建的一组用于软件系统规范的规则和符号。

46-解释抛出

我们告诉编译器可以使用throws关键字抛出错误。 在引发错误之前,我们需要列出您要引发的所有可能的错误的列表。

47-什么是协议扩展?

我们可以在扩展名以及原始类型声明中采用协议。 这使您可以将协议添加到不一定拥有的类型。

48-什么是本地通知的三个触发器?

位置,日历和时间间隔。 当手机上的GPS处于某个位置或地理区域时,会触发位置通知。 日历触发器基于细分为日期组件的日历数据。 时间间隔是秒数,直到计时器关闭。

49-在ObjC中解释选择器

选择器是Objective-C对方法名称的内部表示。

50-什么是远程通知附件的限制?

我们可以通过视频或图像发送推送通知。 但最大有效负载为4kb。 如果我们要发送高质量的附件,则应使用Notification Service Extension

我的建议

  • 精选的iOS面试问题清单。

而已。 😃😃😃感谢您的阅读。 我希望所有这些问题都能对您的面试有所帮助。 第4部分已准备就绪。

如果您想在社交媒体上关注我。 这是一些链接。 github,twitter,linkedin

您可以在这里查看我的上一篇文章。