50个面试问题每个iOS开发人员都应该知道。 (第2部分)

希望你们喜欢本系列的第1部分。 让我们在第2部分中探讨更多面试问题。

  1. 如何用约束为视图制作动画?
  • 您需要在动画块内调用layoutIfNeeded。 苹果实际上建议您在动画块之前调用一次,以确保所有未完成的布局操作已完成
  • 您需要专门在父视图(例如self.view)上调用它,而不是在附加了约束的子视图上调用它。 这样做将更新所有受约束的视图,包括为其他可能受约束的视图设置动画(例如,将视图B附加到视图A的底部,而您刚刚更改了视图A的顶部偏移,并且希望视图B)制作动画)

2.解释如何在Xcode项目中添加框架?

在左列,选择您的项目。 在右窗格中有一个带有项目名称的图标/按钮。 单击UpDown图标,然后从Project更改为Target。 然后转到“常规”选项卡,向下滚动到“框架”部分并添加/删除框架。

3.提到Xcode中PO命令的用途是什么?

p命令(又名expr —)采用给定的参数,将它们视为在当前帧的上下文中编写的源代码表达式进行编译,然后执行结果(可以通过在编译结果上运行解释器)进行:这是可能的,或者通过JIT编译结果,将其插入目标程序中并在其中运行。 然后打印评估结果。

po命令(aka expr — O —)执行p的所有操作,但是如果结果是指向ObjC对象的指针,则不打印结果,而是调用该对象的“ description”方法,并打印该对象返回的字符串方法(*)。 同样,如果结果是CF对象,它将调用CFShow并打印该结果。 如果这两次尝试均失败,它将继续打印结果,就像p一样。

4.界限和框架之间的区别?

UIView的边界是矩形,表示为相对于其自身坐标系(0,0)的位置(x,y)和大小(宽度,高度)。 UIView的框架是矩形,表示为相对于其中包含的超级视图的位置(x,y)和大小(宽度,高度)。

5.我们如何在iOS中进行多线程处理?

使用GCD来实现这一目标,请看下面

步骤1:使用dispatch_queue_create创建队列

步骤2:添加块并调用dispatch_async

6.当应用程序处于后台时,我们如何执行一些代码?

在rckoenes声明的基础上,允许应用程序在用户单击“主页”按钮后注册要完成的后台任务。 完成这些任务的时限为10或15分钟。 同样,您可以注册一个任务,以在用户回家后立即完成任务,这不允许您在退出应用程序一小时后执行代码。

7.如何在启动另一个线程之前等待某个线程完成?

我以前使用的技术是为线程提供一个选择器,该选择器用于原始对象(位于主线程中)中的方法。 当第二个线程启动时,主线程继续执行,但在显示器上显示某种繁忙的指示器。 如果需要,这允许用户继续交互。

当第二个线程结束时(即在关闭之前),它将调用主线程上的选择器。 然后,选择器引用的方法从显示中删除繁忙指示符,并告诉主线程进行更新,以拾取第二个线程生成的所有数据。

同步多线程的几种技术方法,例如NSConditionLock(mutex-lock),NSCondition(semaphore)。但是,它们是Objective-c之外其他语言(java…)的常见编程知识。

8.如何在iOS中安全地存储用户信息(用户名,密码或令牌)?

您应该始终使用钥匙串来存储用户名和密码,并且由于它安全地存储并且只能由您的应用访问,因此在应用退出时无需删除它。

9.如果我们可以创建自定义UIView,为什么要提供UIControl?

UIControl类增加了对交互性的支持。 最重要的是,它添加了目标/动作模式。 查看具体的子类,我们可以看到按钮,日期选择器,文本字段等。 创建交互式控件时,您通常希望将UIControl的后代子类化。

10.什么是UIViewController的生命周期事件?

ViewDidLoad —在创建类并从xib加载时调用。 非常适合初始设置和一次性工作。

ViewWillAppear —在视图出现之前立即调用,非常适合隐藏/显示字段或您希望在视图可见之前每次进行的任何操作。 因为您可能会在视图之间来回移动,所以每次视图将出现在屏幕上时都会调用此方法。

ViewDidAppear —在视图出现后调用—是启动动画或从API加载外部数据的好地方。

ViewWillDisappear / DidDisappear —与ViewWillAppear / ViewDidAppear相同的想法。

ViewDidUnload / ViewDidDispose —在Objective C中,您可以在此处进行清理和发布内容,但是此操作是自动处理的,因此您在这里实际上不需要做很多事情。

11. viewDidLoad和viewDidAppear之间的区别?

创建控制器后,将调用一次viewDidLoad,并在每次视图出现时都调用viewDidAppear。

12. UIKit线程安全吗?

现在,在UIKit中绘图到图形上下文是线程安全的。 特别:

现在,用于访问和操纵图形上下文的例程可以正确处理驻留在不同线程上的上下文。 字符串和图像绘图现在是线程安全的。 现在可以安全地在多个线程中使用颜色和字体对象。

13.为什么我们重写drawRect:方法? 如何显式调用它?

您永远不要自己调用drawRect。 取而代之的是,您通过使用setNeedsDisplay方法告知系统需要进行绘制,该方法将视图标记为肮脏。

14.什么是层?

CALayers只是类,代表具有可视内容的屏幕上的矩形。

15.框架提供哪些各种单例实例? (UIApplication,NSFileManager,NSUserDefaults等)

无论应用程序请求多少次,单例类都将返回相同的实例。 几个可可框架类是单例。 它们包括NSFileManager,NSWorkspace,以及UIKit中的UIApplication和UIAccelerometer。

16.什么是NSUserDefaults? 我们可以在其中存储什么类型的数据?

NSUserDefaults是一个类,允许简单存储不同的数据类型。 对于需要在应用程序启动或设备重新启动之间保留的少量信息,它是理想的选择。 NSUserDefaults支持以下数据类型:NSString。 NSNumber。

17.如何检查代码是否存在内存泄漏?

泄漏分析模板使​​用“分配和泄漏”工具来测量应用程序中的常规内存使用情况并检查泄漏-已分配给不再引用且无法访问的对象的内存。

在这里阅读更多。

18.静态分析仪做什么?

甚至在运行应用程序之前,请使用静态分析器查找代码中的错误。 静态分析器在几秒钟内尝试了数千种可能的代码路径,报告了可能被隐藏的潜在错误或几乎无法复制的错误。 此过程还可以识别代码中不遵循建议的API使用情况的区域,例如Foundation,UIKit和AppKit习惯用法。

19. Instruments Xcode对应用程序性能分析支持哪些不同?

CPU分析,内存分析和时间分析

20.解释通知中心,本地和远程通知的概念。

通知中心是iOS [1]和macOS [2]中的一项功能,可概述来自应用程序的警报。本地通知和远程通知是在应用程序可用新数据时通知用户的方法,即使您的应用程序未在其中运行也是如此。前景。

使用本地通知 ,您的应用程序在本地配置通知详细信息,并将这些详细信息传递给系统,然后系统在您的应用程序不在前台时处理通知的传递。 iOS,tvOS和watchOS支持本地通知。

通过远程通知 ,您可以使用公司的一台服务器通过Apple Push Notification服务将数据推送到用户设备。 iOS,tvOS,watchOS和macOS支持远程通知。

21.您是否已在Appstore中上传了应用程序? 什么过程?

第一个问题的答案将取决于您的经验。

组装应用商店信息

创建捆绑包标识符

创建证书签名请求

创建App Store生产证书

创建生产配置文件

创建一个应用商店列表

创建发布版本填写版本信息

提交版本以供审核

发布

22. Developer和Enterprise Developer帐户之间的区别?

开发人员帐户与企业开发人员帐户之间的主要区别:

开发者帐户:通过App Store分发您的应用

企业帐户:直接将专有应用程序分发给您托管的员工,并获得代码级技术支持

23. Appstore审核过程拒绝应用程序的常见原因?

  • 崩溃和错误
  • 链接断开
  • 占位符内容
  • 信息不完整
  • 说明不正确
  • 误导用户
  • 不合格的用户界面
  • 广告
  • Web剪辑,内容聚合器或链接集合
  • 重复提交类似应用
  • 持久价值不足

24. REST是什么意思?

REST代表代表性状态转移。 (有时将其拼写为“ ReST”。)它依赖于无状态,客户端-服务器,可缓存的通信协议,并且在几乎所有情况下,都使用HTTP协议。

25.什么是通配符应用程序ID?

通配符应用程序ID的包ID搜索字符串的最后部分包含一个星号。 星号替换搜索字符串中的部分或全部捆绑包ID。

当将捆绑包ID搜索字符串与捆绑包ID匹配时,星号被视为通配符。 为了使通配符应用程序ID与一组应用程序匹配,捆绑软件ID必须与捆绑软件ID搜索字符串中星号前面的所有字符完全匹配。 星号与分发包ID中的所有其余字符匹配。 星号必须与包ID中的至少一个字符匹配。

26.解释应用程序沙箱。

将应用程序沙盒化是将应用程序的特权限制在其预期功能上的一种保护系统和用户的好方法,从而增加了恶意软件入侵用户系统的难度。

App Sandbox是macOS中提供的一种访问控制技术,在内核级别实施。 如果应用程序被盗用,它旨在包含对系统和用户数据的破坏。 通过Mac App Store分发的应用程序必须采用App Sandbox。 使用开发人员ID在Mac App Store外部签名和分发的应用程序也可以(并且在大多数情况下应该)使用应用程序沙箱。

27.解释〜/ Documents,〜/ Library,〜/ tmp。 iOS上的〜目录是什么?

tmp /使用此目录可以写入不需要在应用程序启动之间保留的临时文件。 当不再需要文件时,您的应用应从该目录中删除文件; 但是,当您的应用未运行时,系统可能会清除此目录。 iTunes或iCloud不会备份此目录的内容。

库/这是不是用户数据文件的所有文件的顶级目录。 您通常将文件放在几个标准子目录之一中。 iOS应用程序通常使用“应用程序支持”和“缓存”子目录。 但是,您可以创建自定义子目录。 对于不想公开给用户的任何文件,请使用“库”子目录。 您的应用不应将这些目录用于用户数据文件。 iTunes和iCloud备份了Library目录的内容(“ Caches”子目录除外)。 有关“库”目录及其常用子目录的其他信息,请参阅“库目录存储特定于应用程序的文件”。

Documents /使用此目录存储用户生成的内容。 可以通过文件共享使该目录的内容对用户可用。 因此,他的目录应该只包含您可能希望向用户公开的文件。 该目录的内容由iTunes和iCloud备份。

28.如何取消符号化崩溃日志?

  • 取得任何.xcarchive文件。 如果您之前有一个,可以使用它。 如果您没有,请通过从Xcode运行产品>存档来创建一个。
  • 右键单击.xcarchive文件,然后选择“显示软件包内容”
  • 将dsym文件(已崩溃的应用程序的版本)复制到dSYMs文件夹
  • 将.app文件(已崩溃的应用程序的版本)复制到“产品”>“应用程序”文件夹中。
  • 编辑Info.plist并编辑ApplicationProperties词典下的CFBundleShortVersionString和CFBundleVersion。 这将有助于您以后识别存档
  • 双击.xcarchive以将其导入Xcode。 它应该打开管理器。
  • 返回崩溃日志(在Xcode的“设备”窗口中)
  • 将您的.crash文件拖到那里(如果尚不存在)
  • 整个崩溃日志现在都应该用符号表示。 如果不是,请右键单击并选择“重新符号化崩溃日志”

29. iOS支持多少种背景模式?

  • 音频和AirPlay
  • 位置更新
  • IP语音
  • 书报摊下载
  • 外部配件通讯
  • 使用蓝牙LE配件
  • 充当蓝牙LE附件
  • 后台获取
  • 远程通知

30.什么是NSPersistentStoreCoordinator? 它执行什么职责?

一个将持久性存储与模型(或模型的配置)相关联并在持久性存储和被管理对象上下文之间进行中介的协调器。

31.什么是NSPersistentStore? 它是线程安全的吗?

所有Core Data持久性存储的抽象基类。 是的,它的线程安全。

32.什么是NSManagedObjectContext? 有哪些不同的并发类型? 解释每种类型。

表示单个对象空间或便笺本的对象,可用于获取,创建和保存托管对象。

专用队列(privateQueueConcurrencyType):上下文创建和管理专用队列。

主队列(mainQueueConcurrencyType):上下文与主队列相关联,并因此绑定到应用程序的事件循环中,但是在其他方面类似于基于私有队列的上下文。 您将此队列类型用于链接到仅在主线程上使用的控制器和UI对象的上下文。

33.不同类型的持久性存储? iOS上可以有哪些所有类型?

XML自动,二进制自动,SQLite,内存中

34.我的应用程序可以有多个模型吗?

35.在一个模型中,一个sqlite db文件中是否可以有几个实体,而另一个sqlite db文件中却可以剩下几个实体? (是的,提示:配置)

是的,您可以使用ATTACH进行此操作

36. performBlock:和performBlockAndWait:有什么区别?

performBlock是异步的,它立即返回,并且该块在将来的某个时间在某个未公开的线程上执行。 通过performBlock提供给MOC的所有块将按照它们被添加的顺序执行。

performBlockAndWait是同步的,因为调用线程将等到该块执行后再返回。 块是在其他线程中运行还是在调用线程中运行并不那么重要,并且是无法信任的实现细节。

37.从哪个iOS版本开始,支持ARC?

iOS 4.3及更高版本支持ARC。

38.为什么在块中使用self时通常会创建弱引用?

您不必总是使用弱引用。 如果您的块没有保留,而是被执行然后丢弃,则可以强烈地捕获自身,因为它不会创建保留周期。 在某些情况下,您甚至希望该块保留自身,直到该块完成为止,这样它才不会过早地解除分配。 但是,如果您强烈捕获该块,并在捕获自身内部,则会创建一个保留周期。

39.在iOS上处理什么内存管理?

内存管理是管理对象生命周期并在不再需要它们时释放它们的编程准则。 管理对象内存关系到性能。 如果应用程序不释放不需要的对象,则其内存占用量会增加,并且性能会受到影响。

40.弱者和强者有什么区别?

强:强引用是对阻止其释放的对象的引用。 换句话说,它创建了所有者关系。

弱:弱引用是对不阻止其释放的对象的引用。 换句话说,它不会创建所有者关系

41.什么是内存泄漏?

内存泄漏是程序不再引用的已分配内存块。 通过用无法访问的数据填充内存页面来浪费空间,并且由于额外的页面调度活动而浪费时间。

42.什么是保留周期?

保留周期为条件当2个对象相互引用并被保留时,由于两个对象试图相互保留,因此将创建一个保留周期,从而无法释放。

43.复制和保留有什么区别?

保留将对象的保留计数增加1,并获得对象的所有权。 而copy将复制内存位置中存在的数据并将其分配给变量,因此,在复制的情况下,您首先要从某个位置复制数据,将其分配给变量会增加保留计数。

44.解释MRC和ARC之间的区别。 或ARC与MRC相比有什么优势?

在ARC中,操作系统负责内存管理,因此您不必担心释放对象。 对于初学者来说,它非常整洁。 而在“手动计数”中,您将必须跟踪释放内存的过程,如果操作不正确,最终将导致应用崩溃

45. ARC是编译时还是运行时功能?

它的编译时间功能

46.堆栈/堆内存有什么区别?

堆栈用于静态内存分配,堆用于动态内存分配

47.强和保留之间的区别。

强和保留之间的区别:

在iOS4中,strong等于retain,这意味着您拥有该对象并将其保留在堆中,直到不再指向它为止。如果您编写retain,它将自动像strong一样工作

48.什么是线程安全的?

如果代码在从多个线程访问时能够正确运行,则无论线程在运行时环境中对这些线程的执行进行调度或交织,并且在调用代码部分没有任何其他同步或其他协调的情况下,如果代码行为正确,则是线程安全的。

49. Xcode中的单元测试和UI测试有什么区别?

UI测试使您能够查找应用程序的UI并与之交互,以验证UI元素的属性和状态。

就像任何其他工具一样, 单元测试是一种工具。 它的目的是使我们更好地完成工作,从而生产强大,可维护的软件。 这是一个足够简单的前提:编写代码以构建行使给定方法,函数,类或功能的特定行为的环境。 变量以科学的方式隔离,从而以逻辑原子性检验假设。

50.解释XCtest测试用例代码。

  • 测试目标,测试包和测试导航器
  • 创建测试类
  • 测试课程结构
  • 测试执行流程
  • 编写测试方法
  • 编写异步操作测试
  • 编写性能测试
  • 编写UI测试
  • XCTest断言

感谢您阅读本文,我们始终欢迎您的建议。

与往常一样,所有互联网上可用的博客,教程和文档都值得一看。

祝您面试顺利。