50道iOS面试问答 - 2

1- Please explain Method Swizzling in Swift

方法混合(Method swizling)是Objective-C和其他支持动态方法调度的语言中的一个著名实践。通过混合,可以在运行时用不同的方法替换方法的实现,方法的实现可以通过更改特定#selector(方法)和包含其实现的函数之间的映射来实现。

要在你的Swift类中使用方法混调,有两个要求你必须遵守:

  • 包含要混合的方法的类必须扩展NSObject
  • 你想要混合的方法必须有dynamic属性

2- What is the difference Non-Escaping and Escaping Closures?

非逃逸闭包的生命周期很简单:

  1. 向函数传递闭包
  2. 函数运行闭包(或不运行)
  3. 函数返回

逃离闭包意味着, 在函数内部,您仍然可以运行(或不运行)闭包; 闭包的额外部分被存储在某个地方,它的寿命比函数长。有几种方法可以让逃逸闭包包含它的函数:

  • Asynchronous execution: 如果在分派队列上异步执行闭包,该队列将为您保留该闭包。您不知道闭包何时执行,也不能保证它在函数返回之前完成。
  • Storage: 将闭包存储到一个全局变量、属性或函数调用之后的任何其他存储位意味着闭包也已逃逸。

更多细节

3- Explain [weak self] and [unowned self] ?

unowned(非强引用)和弱引用一样,只有一个例外:变量不会变成nil,而且不能是可选的。

您试图在变量的实例已被释放后访问该变量时。这意味着,只有当您确定在对应的实例被释放后该变量将永远不会被访问时,您才应该使用unowned变量。

但是,如果您不希望该变量是弱的,并且您确定在相应的实例被释放后无法访问该变量,那么您可以使用unowned

  • 每次与非可选类型一起使用
  • 每次与let连用

通过声明它[weak self]你可以处理这种情况,它可能在闭包内的某个点为nil,因此变量必须是可选的。在一个异步网络请求中使用 [weak self] 的例子,是在一个视图控制器中,该请求被用来填充视图。

4- What is ARC ?

ARC是一个编译时特性,是苹果版本的自动内存管理。它代表自动引用计数。这意味着它只在对象没有强引用/时释放对象的内存。

5- Explain #keyPath() ?

使用#keyPath(),将通过将键路径字面量字符串用作StaticString或StringLiteralConvertible来执行静态类型检查。此时,将检查它以确保它是正确的

  1. 真的是一种存在的东西吗

  2. 正确地使用Objective-C。

6- Explain Difference between SceneDelegate and AppDelegate

AppDelegateis 是UIKit框架的一部分。 The SceneDelegatetakes 在iOS13中从AppDelegate中接管了这个角色。窗口的概念被场景的概念所取代。多个场景让我们能够在iOS和iPadOS上构建多窗口应用。

7- What makes React Native special for iOS? (React Native为何适合iOS?)

  1. (不像PhoneGap)与React Native你的应用逻辑是在JavaScript中编写和运行,而你的应用UI是完全本地的;因此,你没有HTML5 UI的典型妥协。

  2. 另外(与Titanium不同),React引入了一种新颖、激进且功能强大的方法来构建用户界面。简而言之,应用程序UI只是表示为当前应用程序状态的函数。

8- What is NSFetchRequest?

NSFetchRequest是负责从Core Data获取数据的类。获取请求既强大又灵活。 您可以使用获取请求来获取一组符合所提供的条件、单个值等的对象。

9- Explain NSPersistentContainer

持久化容器创建并返回一个容器,将应用程序的存储加载到该容器中。 此属性是可选的,因为存在可能导致存储创建失败的合法错误条件。

10- Explain NSFetchedResultsController

NSFetchedResultsController是一个控制器,但不是视图控制器。它没有用户界面。它的目的是为了简化开发人员的工作,抽象出同步一个表视图和一个由Core data支持的数据源所需的大量代码。

正确地设置NSFetchedResultsController,你的表就会模仿它的数据源,而不需要写几行代码。

11- What is the three major debugging improvements in Xcode 8?

视图调试器让我们可视化我们的布局,并在运行时查看约束定义。虽然从Xcode 6开始就有了,但是Xcode 8为约束冲突和其他非常方便的特性引入了一些方便的新警告。

线程杀毒器是Xcode 8中一个全新的运行时工具,它可以提醒你线程问题——尤其是潜在的竞争条件。

内存图形调试器也是Xcode 8的新功能。 它提供了可视化的应用程序的内存图在时间点和标志泄漏在问题导航器。

12- What is the Test Driven Development of three simple rules?

  1. 您不允许编写任何产品代码,除非它是为了使失败的单元测试通过。

  2. 您不允许编写任何足以失败的单元测试; 编译失败就是失败。

  3. 除了能够通过一个失败的单元测试之外,您不允许编写更多的产品代码。

13- Please explain final keyword into the class?

通过在方法名前添加关键字final,我们可以防止方法被重写。 如果我们可以将最后一个class关键字替换为一个单词static并获得相同的行为。

14- What does Yak Shaving mean? (薅牛毛什么意思)

“薅牛毛”是一个编程术语,指的是一个项目进入下一个里程碑之前需要执行的一系列任务。

15- What is the difference open & public access level?

  • open允许其他模块使用该类并继承该类; 对于成员,它允许其他模块使用该成员并覆盖它。有关更多信息,参考Apple官方指南。

  • public 只允许其他模块使用公共类和公共成员。公共类不能再被子类化,也不能重写公共成员。

16- What is the difference fileprivate, private and public private(set) access level ?

fileprivate 在当前文件中是否可以从不同的类或结构访问, private 可在当前声明中访问。它在文件外不可见。

public private(set) 意思是getter是公共的,setter是私有的。

17- What is Internal access ?

内部访问允许实体在其定义模块的任何源文件中使用,但不能在模块外部的任何源文件中使用。

内部访问是默认的访问级别。因此,即使我们没有在代码中编写任何访问控制说明符,我们的代码在默认情况下已经处于内部级别。

18- What is the difference between BDD and TDD?

BDD和TDD之间的主要区别在于BDD测试用例可以被非工程师阅读,这在团队中非常有用。

iOS我更喜欢Quick BDD框架和它的“匹配器框架”,叫做Nimble。

19- Please explain “Arrange-Act-Assert”

AAA是一种在单元测试中安排和格式化代码的模式。 如果我们要编写XCTests,每个测试将把这些功能部分分组,用空白行分隔:

  • 安排所有必要的先决条件和输入。
  • 作用于被测试的对象或方法。
  • 断言预期的结果已经发生。

20- What is the benefit of writing tests in iOS apps?

  • 首先编写测试让我们对API设计有了一个清晰的视角,在API存在之前就成为它的客户。

  • 好的测试可以作为预期行为的优秀文档。

  • 它给了我们不断重构代码的信心,因为我们知道,如果我们破坏了任何东西,我们的测试就会失败。

  • 如果测试很难编写,通常可以改进标识体系结构。遵循RGR (Red - Green - Refactor)可以帮助你在早期做出改进。

21- What is five essential practical guidelines to improve your typographic quality of mobile product designs?

(什么是五个基本的实用指南来提高你的移动产品设计的排版质量?)

  1. 从选择正文字体开始。
  2. 尽量避免混合字体。
  3. 注意你的线长度。
  4. 平衡线高和点尺寸。
  5. 使用适当的撇号和破折号。

22- Explain Forced Unwrapping

当我们将一个变量定义为可选时,为了从这个变量中获得值,我们必须解包它。这只是意味着在变量的末尾加一个感叹号。隐式unwrapped可选类型的例子是我们为视图控制器创建的IBOutlets。

当我们知道一个可选对象有一个值时,我们必须使用Forced Unwrapping。

23- How to educate app with Context?

上下文技术教育帮助用户以一种他们以前没有这样做过的方式与元素或表面进行交互。这种技术通常包括轻微的视觉提示和微妙的动画。

24- What is bitcode ?

Bitcode是指发送到iTunes Connect的代码类型“LLVM Bitcode”。这允许苹果使用特定的计算来重新优化应用(例如:可能缩小可执行文件的大小)。 如果苹果需要修改你的可执行文件,他们可以在不上传新版本的情况下完成。

25- Explain Swift Standard Library Protocol ?

有一些不同的协议。 Equatable协议,它决定了我们如何区分两个相同类型的实例。 这意味着我们可以进行分析。 如果数组中有一个特定的值。comparable协议,比较相同类型和序列的两个实例:prefix(while:)和drop(while:)[SE-0045].

Swift 4引入了一个新的Codable协议,允许我们序列化和反序列化自定义数据类型,而无需编写任何特殊代码。

26- What is the difference SVN and Git ?

SVN采用集中式版本管理系统。它是一个生成工作副本的中央存储库,需要通过网络连接进行访问。

Git依赖于分布式系统进行版本管理。您将拥有一个可以在其上工作的本地存储库,只需要一个网络连接来进行同步。

27- What is the difference CollectionViews & TableViews?

Tableview以单列、垂直的方式显示项目列表,并且仅限于垂直或水平滚动.

CollectionViews还显示项目列表,但是,它们可以有多列和多行。

28- What is Alamofire doing?

Alamofire在后台使用URL加载系统,所以它与苹果提供的所有网络开发机制集成得很好。 这意味着,它提供了可链接的请求/响应方法、JSON参数和响应序列化、身份验证和许多其他特性。它有线程机制,在后台线程上执行请求,在主线程上调用完成块。

29- REST, HTTP, JSON — What’s that?

HTTP 是应用协议或一组规则,网站用于从web服务器传输数据到客户端。客户端(你的web浏览器或应用程序)用来指示想要的动作:

  • GET: 用于检索数据,如网页,但不改变服务器上的任何数据。
  • HEAD: 与GET相同,但只返回头,不返回实际数据。
  • POST: 用于向服务器发送数据,通常在填写表单和单击提交时使用。
  • PUT: 用于将数据发送到提供的特定位置。
  • DELETE: 从提供的特定位置删除数据。

REST, 具象状态传输(REpresentational State Transfer)是一套用于设计一致、易于使用和维护的web api的规则。
JSON 表示JavaScript对象表示法;它为在两个系统之间传输数据提供了一种简单的、人类可读的和可移植的机制。 Apple提供了JSONSerialization类来帮助将内存中的对象转换为JSON,反之亦然。

30- What problems does delegation solve?

  • 避免对象的紧密耦合
  • 修改行为和外观而不需要子类化对象
  • 允许将任务移交给任何任意对象

31- What is the major purposes of Frameworks?

框架有三个主要目的:

  • 封装
  • 模块化
  • 代码重用

您可以与其他应用程序、团队成员或iOS社区共享您的框架。当与Swift的访问控制相结合时,框架有助于在代码模块之间定义强大的、可测试的接口。

32- Explain Swift Package Manager

Swift Package Manager将极大地改善Swift的生态系统,使Swift更容易在没有Xcode的平台上使用和部署,比如Linux。Swift Package Manager还解决了使用许多相互依赖的库时可能发生的依赖地狱问题。

Swift Package Manager只支持使用主分支。Swift Package Manager现在支持Swift, C, c++和Objective-C的包。

33- What is the difference between a delegate and an NSNotification?

委托和NSNotifications可以用来完成几乎相同的功能。然而,委托是一对一的,而NSNotifications是一对多的。

34- Explain SiriKit Limitations

  • SiriKit不能使用所有应用类型
  • 不是一个完整的应用程序的替代品,只是一个扩展
  • Siri需要持续的互联网连接才能工作
  • Siri服务需要与苹果服务器通信。

35- Why do we use a delegate pattern to be notified of the text field’s events?

因为最多只有一个对象需要知道这个事件。

36- How is an inout parameter different from a regular parameter?

Inout按引用传递,而常规参数按值传递。

37- Explain View Controller Lifecycle events order?

There are a few different lifecycle events

  • loadView

创建控制器管理的视图。它只在视图控制器被创建时被调用,并且只在以编程方式完成时被调用。它首先负责使视图属性存在。

  • viewDidLoad

在控制器的视图加载到内存后调用。它只在视图创建时被调用。

  • viewWillAppear

每当视图显示在屏幕上时,它就被调用。在这一步中,视图定义了边界,但没有应用方向。

  • viewWillLayoutSubviews

调用它来通知视图控制器它的视图将要布局它的子视图。每次帧发生变化时都会调用此方法

  • viewDidLayoutSubviews

调用它来通知视图控制器它的视图已经布局了它的子视图。在视图布局它的子视图之后,在这里做一些额外的更改。

  • viewDidAppear

通知视图控制器其视图已被添加到视图层次结构中。

  • viewWillDisappear

在过渡到下一个视图控制器和原始视图控制器从屏幕上移除之前,这个方法会被调用。

  • viewDidDisappear

当视图控制器从屏幕上移除后,这个方法会被调用。当视图控制器不在屏幕上时,你通常会重写这个方法来停止不应该运行的任务。

  • viewWillTransition(to:with:)

当界面方向改变时,UIKit会在窗口的根视图控制器上调用这个方法,然后再改变窗口的大小。然后根视图控制器通知它的子视图控制器,在视图控制器层次结构中传播消息。

38- What is the difference between LLVM and Clang?

Clang是LLVM工具链的前端(“Clang”C语言家族前端LLVM)。 每个编译器有三个部分。

  1. 前端(词法分析、解析)
  2. 优化器(优化抽象语法树)
  3. 后端(机器码生成)

前端(Clang)获取源代码并生成抽象语法树(LLVM IR)。

39- What is Class ?

类是用来定义对象及其工作方式的。这样,类就像是对象的蓝图。

40- What is Object?

对象是类的实例。

41- What is interface?

Objective-C中的@interface与Java接口无关。它只是声明一个类的公共接口,即它的公共API。

42- When and why do we use an object as opposed to a struct?

结构是值类型。类(对象)是引用类型。

43- What is UIStackView?

UIStackView提供了一种水平或垂直布局一系列视图的方法。我们可以定义包含的视图如何根据可用空间调整自身。不要错过这篇文章

44- What are the states of an iOS App?

  • 非运行-应用程序没有运行。
  • 非活跃-应用程序正在前台运行,但没有接收事件。iOS应用程序可以被置于非激活状态,例如,当收到电话或短信时。
  • 活跃-应用程序在前台运行,并接收事件。
  • 后台-应用程序在后台运行,并执行代码。
  • 挂起-应用程序在后台,但没有代码正在执行。

45- What are the most important application delegate methods a developer should handle?

操作系统在应用程序委托中调用特定的方法,以促进不同状态之间的转换。开发者应该处理的七个最重要的应用委托方法是: 省略

46- What is the difference between property and instance variable?

属性是一个更抽象的概念。 实例变量实际上就是一个存储槽,就像结构中的槽一样。 通常其他对象不应该直接访问它们。通常,一个属性将返回或设置一个实例变量,但它可以使用来自多个实例变量的数据,或者根本不使用。

47- How can we add UIKit for Swift Package Manager?

Swift Package Manager不支持UIKit。我们可以为其他项目创建文件模板或框架。

48- Explain the difference between SDK and Framework

SDK是一套软件开发工具。该集合用于创建应用程序。 框架基本上是一个用于开发软件应用程序的平台。它为特定平台的程序开发提供了必要的基础。SDK和Framework是相辅相成的,SDK可以用于框架。

49- What is Downcasting? (向下类型转换是什么?)

当我们在Objective-C中将对象转换为另一种类型时,这很简单,因为只有一种方法。但在Swift身上,有两种投角色的方式——一种是安全的,另一种则不是。

  • as used for upcasting and type casting to bridged type
  • as? 用于安全类型转换,如果失败返回nil
  • as! 用于强制转换,失败时崩溃。应该只在我们知道向下转换会成功的时候才使用。

50- Explain Labeled Statements (解释标记语句)

使用labelled语句,我们可以指定要中断的控制结构,无论循环嵌套的深度有多深。这也适用于continue。如果我们有一个包含嵌套的for循环的复杂结构,标记语句将允许我们从外部循环中中断,并继续执行该方法。

#define

label name: while condition {
    statements
}

demo

gameLoop: while square != finalSquare {
    diceRoll += 1
    if diceRoll == 7 { diceRoll = 1 }
    switch square + diceRoll {
    case finalSquare:
        // diceRoll will move us to the final square, so the game is over
        break gameLoop
    case let newSquare where newSquare > finalSquare:
        // diceRoll will move us beyond the final square, so roll again
        continue gameLoop
    default:
        // this is a valid move, so find out its effect
        square += diceRoll
        square += board[square]
    }
}
print("Game over!")