IOS面试常见问题解答(2018年8月)

2018年8月iOS最新面试题

在本文中,我将介绍在最近的采访中(2018年8月)向iOS工程师询问的一些问题。 那些正在准备的人一定会对他们有所帮助。

Q1。 swift和目标C有什么区别?

Q2。 什么是手动保留周期?

Q3。 Swift中的内存管理如何工作?

我们首先看一下Swift中的内存管理基础知识。 ARC(自动引用计数)为您完成了大多数内存管理工作,这是一个好消息。 原理很简单:默认情况下,每个指向类实例的引用都是所谓的强引用。 只要有至少一个强引用指向一个实例,该实例就不会被释放。 如果没有足够的参考指向该实例,则该实例将被释放。 让我们看下面的例子:

  class TestClass {init(){print(“ init”)} deinit {print(“ deinit”)}} var testClass:TestClass?  = TestClass()testClass =无 

创建实例后,情况如下所示:

testClass对TestClass的实例有很强的引用。 如果我们现在将此引用设置为nil,则强引用将消失,并且由于没有强引用,因此TestClass的实例将被释放:

顺便说一句,如果您看一下控制台,您会发现一切工作正常,因为只有在释放实例时,系统才会调用deinit方法:

如果TestClass的实例未释放,则不会出现“ deinit”消息。 正如我们将在后面讨论的那样,在deinit内放置一条日志消息是观察对象释放的一种很好的方法。

Q4。 拥有所有权的方法有哪些(保留数增加1)?

alloc / init —创建一个对象并声明其所有权

保留—用于声明该对象的所有权

复制—复制对象并声明其所有权

Q5。 什么方法用于声明所有权(将保留计数减少1)?

release —声明对象的所有权。

自动释放—声明对象的所有权。

Q6。 什么是面向协议的编程及其好处?

Swift的设计核心是两个非常强大的想法:面向协议的编程和一流的值语义。 这些概念中的每一个都有益于可预测性,性能和生产率,但是它们一起可以改变我们对编程的思考方式。 了解如何应用这些想法来改进编写的代码。

快速进行面向协议的编程

Q7。 如何检查协议的可选方法在继承的类中实现?

您可以使用isas运算符,如 键入强制类型转换以检查协议一致性,并强制类型转换为特定协议。 检查和转换为协议遵循与检查和转换为类型完全相同的语法:

  • 如果实例符合协议,则is运算符返回true否则返回false
  • as? 向下运算符的版本返回协议类型的可选值,如果实例不符合该协议,则该值为nil
  • as! 向下转换操作符的版本会强制向下转换为协议类型,如果向下转换失败,则会触发运行时错误。

Q8。 您如何找出执行任务的5个并行线程?

参考源代码和说明

Q9。 结构具有默认的参数化init函数,我想同时拥有参数化和空的构造函数,这怎么可能?

Q10。 结构和类有什么区别,您将在哪里使用结构?

类具有结构没有的其他功能:

  • 继承使一个类可以继承另一个类的特征。
  • 类型转换使您可以在运行时检查和解释类实例的类型。
  • 使用反初始化程序,类的实例可以释放其分配的所有资源。
  • 引用计数允许对一个类实例进行多个引用。

Q11。 我有一个1000 var的结构,我想将结构从一个类传递到另一个类,因为它是值类型,您将如何做?

结构和枚举是值类型

值类型是一种在将值分配给变量或常量或将其传递给函数BUT时将其值复制的类型

由标准库(例如数组,字典和字符串)定义的集合使用优化来降低复制的性能成本。 这些集合不共享立即复制的功能,而是共享存储在原始实例与任何副本之间的元素的内存。 如果修改了集合的副本之一,则在修改之前就将元素复制。 您在代码中看到的行为始终就像是立即进行了复制一样。

Q12。 什么是MVVM,它与MVC有何不同?

Q13。 编写代码以创建强大的参考周期?

强大的参考周期可防止释放PersonApartment实例,从而导致应用程序内存泄漏。

范例1:

范例2:

下面的示例显示了在使用引用self的闭包时如何创建强大的引用循环。 此示例定义了一个名为HTMLElement的类,该类为HTML文档中的单个元素提供了一个简单的模型:

Q14。 使用“操作”和“操作队列”-如何运行5个并行线程并在所有线程完成后运行。如何通知所有任务已完成?

Sol1:创建额外的操作,并将所有其他操作作为其依赖项,一旦完成所有5个操作,便将其执行。

Sol2:有操作计数,一旦减少到0,就执行完整的操作。

Q15。 什么是核心数据堆栈以及父子上下文如何工作?

请参阅我的文章: 核心数据与并发

Q16。 NSArray和Array有什么区别?

Array是一个struct ,因此它是Swift中的值类型NSArray是一个不变的Objective C ,因此它是Swift中的引用类型 ,并桥接到ArrayNSMutableArrayNSArray的可变子类。

Q17。 如何快速实施收款?

Swift提供了三种主要的集合类型 ,称为数组,集合和字典,用于存储值的集合。 数组是值的有序集合。 集是唯一值的无序集合。 字典是键-值关联的无序集合。

Swift的数组,集合和字典类型被实现为通用集合 。 有关泛型类型和集合的更多信息

注意

  1. Swift的Array类型桥接到Foundation的NSArray类。

2. Swift的Set类型桥接到Foundation的NSSet类。

3. Swift的Dictionary类型桥接到Foundation的NSDictionary类。

Q18。 您将如何在userdefault中存储自定义对象?

如果您以前曾尝试将自定义对象保存到UserDefaults中,则可能会收到如下错误:
'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object

根据Apple关于UserDefaults的文档,

默认对象必须是属性列表-即NSData,NSString,NSNumber,NSNumber,NSDate,NSArray或NSDictionary的实例(或对于集合而言,是实例的组合)。

你们中的许多人将使用一些功能强大且易于使用的工具开始Swift数据序列化的旅程。 当然,我指的是Swift 4中引入的Codable协议,以免开发人员免于对Data序列化的痛苦。

Q19。 plist的用途是什么?

在iPhone开发的上下文中,“属性列表”是一个键值存储,您的应用程序可以使用它来保存和检索持久数据。

Q20。 闭包及其闭包类型的示例

阅读此以获取更多详细信息

  • 简单关闭
  • 包含语句的闭包
  • 接受参数的封闭
  • 封闭价值
  • 将闭包作为函数参数传递
  • 尾随封口
  • 自动关闭
  • 具有参数和返回值的自动关闭
  • 转义与否转义闭包
  • 没有逃脱的封闭
  • 逃逸关闭

转到第2部分—面试问题,于2018年8月提出

希望您喜欢这篇文章,并且对希望找出最近问到的iOS面试问题的人有用。请❤️将这篇文章推荐给其他人😊。 让我知道您的反馈。 🙂