- 50道iOS面试问答 - 1
- 1- How could you set up Live Rendering? (如何设置实时渲染?)
- 2- What is the difference between Synchronous & Asynchronous task? (同步和异步任务的区别是什么?)
- 3- Explain Compilation Conditions (解释编译环境)
- 4- What is made up of NSError object? (NSError对象是由什么组成的?)
- 5- What is Enum or Enumerations? (什么是枚举或枚举?)
- 6- What is the bounding box? (什么是边界框?)
- 7- Why don’t we use strong for enum property in Objective-C? (为什么Objective-C中不使用strong作为枚举属性呢?)
- 8- What is @synthesize in Objective-C? (Objective-C中的@synthesize是什么)?
- 9- What is @dynamic in Objective-C? (Objective-C中的@dynamic是什么?)
- 10- Why do we use synchronized? (为什么要使用synchronized?)
- 11- What is the difference strong, weaks, read only and copy? (强、弱、只读和copy的区别是什么?)
- 12- What is Dynamic Dispatch? (什么是动态调度?)
- 13- What’s Code Coverage? (什么是代码覆盖率?)
- 14- What’s Completion Handler? (Completion Handler是什么?)
- 15- How to Prioritize Usability in Design ? (如何在设计中优先考虑可用性?)
- 16- What’s the difference between the frame and the bounds? (frame和bounds之间的区别是什么?)
- 17- What is Responder Chain ? (什么是响应链?)
- 18- What is Regular expressions? (什么是正则表达式?)
- 19- What is Operator Overloading? (什么是操作符重载?)
- 20- What is TVMLKit? (TVMLKit是什么?)
- 21- What is Platform limitations of tvOS?
- 22- What is Functions?
- 23- What is ABI?
- 24- Why is design pattern very important ?
- 25- What is Singleton Pattern ?
- 26- What is Facade Design Pattern?
- 27- What is Decorator Design Pattern?
- 28- What is Adapter Pattern?
- 29- What is Observer Pattern?
- 30- What is Memento Pattern?
- 31- Explain MVC
- 32- Explain MVVM
- 33- How many different annotations available in Objective-C ?
- 34- What is JSON/PLIST limits ?
- 35- What is SQLite limits ?
- 36- What is Realm benefits ?
- 37- How many are there APIs for battery-efficient location tracking ? ( 有多少api用于电池效率的位置跟踪?)
- 38- What is the Swift main advantage ?
- 39- Explain generics in Swift ?
- 40- Explain lazy in Swift ?
- 41- Explain what is defer ?
- 42- How to pass a variable as a reference ? (如何传递一个变量作为引用?)
- 43- How to pass data between view controllers?
- 44- What is Concurrency ?
- 45- Grand Central Dispatch (GCD)
- 46- Readers-Writers (读写锁🔐)
- 47- NSOperation — NSOperationQueue — NSBlockOperation
- 48- KVC — KVO
- 49- Please explain Swift’s pattern matching techniques (请解释Swift的模式匹配技术)
- 50- Explain Guard statement
50道iOS面试问答 - 1
1- How could you set up Live Rendering? (如何设置实时渲染?)
@IBDesignable属性允许Interface Builder对特定视图执行实时更新。 IBDesignable需要在UIView类中定义初始frame。
2- What is the difference between Synchronous & Asynchronous task? (同步和异步任务的区别是什么?)
Synchronous:等待任务完成
Asynchronous:在后台完成任务,完成后会通知你
3- Explain Compilation Conditions (解释编译环境)
Compilation Conditions to use if DEBUG … endif structure to include or disable given block of code ve separate targets.
4- What is made up of NSError object? (NSError对象是由什么组成的?)
NSError对象有三部分:域(domain)、错误代码(error code)和用户信息字典(user info dictionary)。域是一个字符串,用于标识错误的类别。
5- What is Enum or Enumerations? (什么是枚举或枚举?)
According to Apple’s Swift documentation:
管理状态,即记录应用程序当前使用情况的数据,是开发应用程序的一个重要部分。
因为枚举定义有限数量的状态,并且可以将关联值绑定到每个单独的状态,所以您可以使用它们对应用程序及其内部进程的状态进行建模。
Enum是一种类型,它基本上在同一伞中包含一组相关的值,但是case-less的Enum不允许我们创建实例。
Reference: https://developer.apple.com/documentation/swift/maintaining_state_in_your_apps
6- What is the bounding box? (什么是边界框?)
边界框是几何学中的一个术语;它指的是一组给定的点在其中的最小度量(面积或体积)。
7- Why don’t we use strong for enum property in Objective-C? (为什么Objective-C中不使用strong作为枚举属性呢?)
因为枚举不是对象,所以这里不指定强或弱。
8- What is @synthesize in Objective-C? (Objective-C中的@synthesize是什么)?
Synthesize为属性生成getter和setter方法。
9- What is @dynamic in Objective-C? (Objective-C中的@dynamic是什么?)
我们对NSManagedObject的子类使用dynamic。@dynamic告诉编译器getter和setter是在其他地方实现的。
10- Why do we use synchronized? (为什么要使用synchronized?)
Synchronized保证在任何给定的时间内,只有一个线程可以执行代码块中的代码。
11- What is the difference strong, weaks, read only and copy? (强、弱、只读和copy的区别是什么?)
强、弱、赋值属性属性定义了如何管理该属性的内存。
Strong示引用计数将增加 对它的引用将在对象的整个生命周期中被维护
Weak(非强引用),意味着我们正在指向一个对象,但没有增加它的引用计数。它经常用于创建父子关系。父对象对子对象有一个强引用,但子对象对父对象只有一个弱引用。
- Every time used on var (每次用在var上)
- Every time used on an optional type (每次用于可选类型)
- Automatically changes itself to nil (自动将自身更改为nil)
Read only,我们可以初始设置属性,但不能更改。
Copy 意味着我们在对象创建时复制它的值。也阻止它的值改变。 要了解更多细节,请查看这个
12- What is Dynamic Dispatch? (什么是动态调度?)
动态调度是选择实现方式的过程 多态操作的(要在运行时调用的方法或函数)。这意味着,当我们想要调用像对象方法这样的方法时。但Swift不默认为动态调度
13- What’s Code Coverage? (什么是代码覆盖率?)
代码覆盖率是帮助我们度量单元测试价值的指标。
14- What’s Completion Handler? (Completion Handler是什么?)
当我们的应用程序进行API调用时,完成处理程序非常方便,当任务完成时,我们需要做一些事情,比如更新UI以显示来自API调用的数据。 我们将在苹果的api中看到完成处理程序,比如dataTaskWithRequest,它们在你自己的代码中非常方便。
完成处理程序接受一个带有3个参数的代码块:(NSData?, NSURLResponse ?, NSError?)返回nothing :Void。这是一个闭包。
The completion handlers have to marked @escaping since they are executed some point after the enclosing function has been executed.
15- How to Prioritize Usability in Design ? (如何在设计中优先考虑可用性?)
将其设计过程划分为4个步骤:
-
像用户一样思考,然后设计用户体验。
-
记住,用户是人,而不是人口统计数据。
-
推广一款应用时,要考虑所有它可能有用的情况。
-
即使在发布后,也要继续致力于应用的实用性。
16- What’s the difference between the frame and the bounds? (frame和bounds之间的区别是什么?)
UIView的bounds是一个矩形,表示为相对于它自己的坐标系统(0,0)的位置(x,y)和大小(宽度,高度)。
UIView的frame是一个矩形,表示为相对于它所包含的父视图的位置(x,y)和大小(宽度,高度)。
17- What is Responder Chain ? (什么是响应链?)
ResponderChain是一个对象层次结构,这些对象有机会响应接收到的事件。
18- What is Regular expressions? (什么是正则表达式?)
正则表达式是描述如何搜索字符串的特殊字符串模式。
19- What is Operator Overloading? (什么是操作符重载?)
操作符重载允许我们改变现有操作符对已经存在的类型的行为方式。操作符是像+、*和/这样的小符号
20- What is TVMLKit? (TVMLKit是什么?)
TVMLKit是TVML、JavaScript和原生tvOS应用程序之间的粘合剂。
21- What is Platform limitations of tvOS?
首先,tvOS不提供任何类型的浏览器支持,也没有任何WebKit或其他基于web的渲染引擎可供编程使用。这意味着你的应用程序不能链接到任何网页浏览器,包括网页链接、OAuth或社交媒体网站。
其次,tvOS应用程序不能显式地使用本地存储。在产品发布时,这些设备都有32gb或64gb的硬盘空间,但应用程序不允许直接写入板载存储。
tvOS app bundle不能超过4gb。
22- What is Functions?
函数让我们将一系列语句组合在一起来执行某些任务。一旦创建了一个函数,它就可以在代码中反复重用。 如果您发现自己在代码中重复语句,那么一个函数可能是避免这种重复的答案。
专业提示,好的函数接受输入并返回输出。糟糕的函数设置全局变量并依赖于其他函数来工作。
23- What is ABI?
对于使用外部库的应用程序来说,abi非常重要。如果构建程序是为了使用某个特定的库,并且该库稍后会更新,那么您不希望必须重新编译该应用程序(并且从最终用户的角度来看,您可能没有源代码)。 如果更新后的库使用相同的ABI,那么您的程序将不需要更改。ABI稳定性将随Swift 5.0而来。
24- Why is design pattern very important ?
设计模式是软件设计中常见问题的可重用解决方案。它们是为了帮助您编写易于理解和重用的代码而设计的模板。最常见的Cocoa设计模式:
- Creational: Singleton.
- Structural: Decorator, Adapter, Facade.
- Behavioral: Observer, and, Memento
25- What is Singleton Pattern ?
单例设计模式确保对于给定的类只有一个实例存在,并且该实例有一个全局访问点。当第一次需要时,它通常使用惰性加载来创建单个实例。
26- What is Facade Design Pattern?
Facade设计模式为复杂的子系统提供了单一的接口。您只公开一个简单的统一API,而不是将用户暴露给一组类及其API。
27- What is Decorator Design Pattern?
Decorator模式动态地向对象添加行为和职责,而无需修改其代码。它是子类化的另一种选择,通过包装另一个对象来修改一个类的行为。
在Objective-C中,这种模式有两种常见的实现:Category和Delegation。在Swift中,这种模式也有两种非常常见的实现: Extensions and Delegation.
28- What is Adapter Pattern?
适配器允许具有不兼容接口的类一起工作。它将自己包装在对象周围,并公开与该对象交互的标准接口。
29- What is Observer Pattern?
在观察者模式中,一个对象将任何状态更改通知其他对象。
Cocoa以两种方式实现观察者模式:通知和Key-Value Observing (KVO)。
30- What is Memento Pattern?
在Memento模式中保存你的东西。 稍后,可以在不违反封装的情况下恢复这种外部化状态;也就是说,私有数据仍然是私有的。苹果的记忆碎片模式的一个特殊实现是存档,iOS使用记忆碎片模式作为状态恢复(State Restoration)的一部分。
31- Explain MVC
-
Models — 负责局部数据或操纵数据的数据访问层,想想“Person”或“PersonDataProvider”类。
-
Views — 负责表示层(GUI),对于iOS环境,考虑所有以“UI”开头的前缀。
-
Controller/Presenter/ViewModel — 它是模型和视图之间的粘合剂或中介,通常负责通过响应用户在视图上执行的操作来更改模型,并使用来自模型的更改来更新视图。
32- Explain MVVM
你的视图和它的状态的UIKit独立表示。视图模型调用模型中的更改,并使用更新后的模型更新自身,由于我们在视图和视图模型之间有一个绑定,因此第一个被相应地更新。
你的视图模型会接受你的模型,它能将显示在你的视图上的信息格式化。
有一个更有名的框架叫做RxSwift。它包含RxCocoa,这是Cocoa和CocoaTouch的反应性扩展。
33- How many different annotations available in Objective-C ?
- _Null_unspecified, 连接到Swift隐式解包可选。这是默认值
- _Nonnull, 该值不会为空,因为它连接到一个常规引用。
- _Nullable 该值可以为nil,它桥接到一个可选的。
- _Null_resettable 当读取时,这个值永远不能为nil,但是你可以将它设置为know来重置它。这只是应用属性。
34- What is JSON/PLIST limits ?
- 我们创建对象,然后将它们序列化到磁盘。
- 这是非常伟大和非常有限的用例。
- 我们显然不能使用复杂的查询来过滤结果。
- 这是非常缓慢。
- 每当我们需要什么东西时,我们需要对它进行序列化或反序列化。
- 这不是线程安全的。
35- What is SQLite limits ?
- 我们需要定义表之间的关系。定义所有表的模式。
- 我们必须手动编写查询来获取数据。
- 我们需要查询结果,然后将它们映射到模型。
- 查询非常快。
36- What is Realm benefits ?
- 开源数据库框架。
- 从头开始实现。
- 零复制对象存储。
- 快。
37- How many are there APIs for battery-efficient location tracking ? ( 有多少api用于电池效率的位置跟踪?)
There are 3 apis.
- Significant location changes — 地点大约每500米(通常最多1公里)传送一次
- Region monitoring — 从半径大于等于100米的圆形区域追踪进入/退出事件。区域监测是仅次于GPS的最精确的API。
- Visit events — 从一个地方(家/办公室)进入/退出的访问事件。
38- What is the Swift main advantage ?
To mention some of the main advantages of Swift:
- 可选类型,使应用程序抗崩溃
- 内置的错误处理
- 闭包
- 比其他语言快得多
- 类型安全语言
- 支持模式匹配
39- Explain generics in Swift ?
泛型创建的代码并不特定于底层数据类型。看这篇文章。泛型允许我们知道它将包含什么类型。泛型还为我们的代码提供了优化。
40- Explain lazy in Swift ?
延迟存储属性的初始值只在第一次调用该属性时计算。 在某些情况下,惰性属性对开发人员非常方便。
41- Explain what is defer ?
delay关键字,它提供了在执行离开当前作用域时将执行的代码块。
42- How to pass a variable as a reference ? (如何传递一个变量作为引用?)
我们需要提到有两种类型的变量:引用类型和值类型。这两种类型的区别在于,通过传递值类型,变量将创建其数据的副本,而引用类型变量将只指向内存中的原始数据。
43- How to pass data between view controllers?
There are 3 ways to pass data between view controllers.
- Segue,在prepareForSegue方法中(向前)
- 委托(向后)
- 直接设置变量(向前)
44- What is Concurrency ?
并发是划分程序的执行路径,以便它们可能同时运行。 常用术语:进程、线程、多线程等。
术语:
- 进程,一个正在执行的应用程序的实例
- 线程,代码执行的路径
- 多线程,同时运行的多个线程或多条执行路径。
- 并发性,以可伸缩的方式同时执行多个任务。
- 队列,队列是轻量级数据结构,按照先进先出(FIFO)的顺序管理对象。
- 同步任务与异步任务
45- Grand Central Dispatch (GCD)
GCD是一个库,它提供了一个底层的、基于对象的API,可以在后台管理线程的同时并发地运行任务。
术语:
- Dispatch Queues, 分派队列负责按照先入先出的顺序执行任务。
- Serial Dispatch Queue, 串行分派队列一次只运行一个任务。
- Concurrent Dispatch Queue, 并发调度队列可以运行尽可能多的任务,而不必等待已启动的任务完成。
- Main Dispatch Queue 全局可用的串行队列,用于在应用程序的主线程上执行任务。
46- Readers-Writers (读写锁🔐)
多个线程同时读取,而应该只有一个线程写入。这个问题的解决方案是一个读写锁,它允许并发的只读访问和独占的写访问。
Terminology;
- Race Condition 当两个或多个线程可以访问共享数据并试图同时更改数据时,就会出现竞争条件。
- Deadlock 当两个或更多的任务等待另一个任务完成时,就会发生死锁,但两者都没有完成。
- Readers-writer 问题同时有多个线程读取,而应该只有一个线程写入。
- Readers-writer 这种锁允许对共享资源进行并发的只读访问,而写操作需要独占访问。
- Dispatch Barrier Block 当使用并发队列时,Dispatch Barrier块创建了一个串行风格的瓶颈。
47- NSOperation — NSOperationQueue — NSBlockOperation
-
NSOperation 与GCD相比,这会增加一些额外的开销,但我们可以在各种操作中添加依赖,并重用、取消或挂起它们。
-
NSOperationQueue, 它允许创建一个线程池,并用于并行执行NSOperations。操作队列不是GCD的一部分。
-
NSBlockOperation 允许你从一个或多个闭包创建一个NSOperation。NSBlockOperations可以有多个block,并发运行。
48- KVC — KVO
-
KVC add表示键值编码。它是一种机制,可以在运行时使用字符串访问对象的属性,而不必在开发时静态地知道属性名。
-
KVO 代表Key-Value Observing,允许控制器或类观察属性值的变化。 在KVO中,一个对象可以要求被通知一个特定属性的任何变化,当属性改变值时,观察者就会被自动通知。
49- Please explain Swift’s pattern matching techniques (请解释Swift的模式匹配技术)
- 元组模式用于匹配相应元组类型的值。
- 类型转换模式允许您转换或匹配类型。
- 通配符模式匹配并忽略任何类型的值。
- 可选模式用于匹配可选值。
- 枚举案例模式匹配现有枚举类型的案例。
- 表达式模式允许您将给定值与给定表达式进行比较。
50- Explain Guard statement
Guard语句有三大好处。
- 一个是避免厄运金字塔,就像其他人提到的那样——有很多恼人的if let语句彼此嵌套,并向右移得越来越远。
- 第二个好处是使用break或return提前退出函数。
- 最后一个好处是,guard语句是安全展开可选对象的另一种方法。