25个IOS面向初中开发者的面试问题和答案。

您好,我叫James Rochabrun,请允许我抛弃这个免责声明 ,但是,现在说这还为时过早。 正如您在本期或以后的帖子中将会看到的那样,英语不是我的母语,因此,如果您对语法犯罪敏感,那么这是离开此页面的最佳时间,我不会个人化,不会有任何感觉伤害。

Phhhhhhiiewwww说了这句话,我的内心不再感到内,这让我深入了解了真正重要的事情。

我是一名IOS开发人员,是一名自学成才的人,没有计算机科学学位,但是对代码充满好奇和热情,我刚刚在旧金山完成了一个iOS Bootcamp,并为两家初创公司工作,为他们的应用开发新功能。 我目前正在从事自由职业项目,但我正在积极寻找更稳定的工作。

就像许多本人一样刚进入该领域的开发人员一样,我目前正处于人生苦闷的时期,被称为“接受过技术职位面试”; 没错…长长的电话,白板测试了所有有趣的东西。 第一次面试中的一个错误答案可以确定您是否找到了工作,或者只是“感谢您的参与”电子邮件。

这就是为什么对我来说(有时您会学习“教学”对吗?),我想分享我从与Wells Fargo,Facebook等公司的访谈以及在线论坛和网站中收集的一系列不错的iOS问题。

1 —什么是内存泄漏?

内存泄漏是一种资源泄漏,当计算机程序以不释放不再需要的内存的方式错误地管理内存分配时,会发生这种情况。 在面向对象的编程中,当对象存储在内存中但无法被运行的代码访问时,可能会发生内存泄漏。

2-描述“应用程序稀疏”是什么意思?

商店和操作系统通过根据用户特定设备的功能量身定制应用程序交付,从而以最小的占用空间优化了iOS,tvOS和watchOS应用程序的安装。 这种称为应用程序细化的优化,使您可以创建使用最多设备功能,占用最少磁盘空间并容纳Apple可以应用的将来更新的应用程序。

3-什么是自动版式?

自动版式会根据对这些视图施加的约束来动态计算视图层次结构中所有视图的大小和位置。

4 —什么是GCD? 如何使用?

GCD是最常用的API,用于管理并发代码和在系统的Unix级别异步执行操作。 GCD提供并管理任务队列。 一个很好的例子是,当应用程序从API获取数据时,此网络调用应在后台线程中进行,并且视图中的数据显示应在主线程中执行,以及任何UI更新。

5-Swift比Objective-C有什么好处?

  • Swift更容易阅读。 (真的吗?)
  • Swift更易于维护。
  • Swift更安全。
  • Swift与内存管理统一。
  • Swift需要更少的代码。
  • Swift更快。
  • 与开源项目的名称冲突更少。
  • Swift支持动态库。
  • Swift Playgrounds鼓励交互式编码。
  • Swift是您可以影响的未来。

这是一个链接,您可以在其中详细查看这些断言。

6 —什么是GCD中的“同步”与“异步”?

这些术语描述了函数何时将控制权返回给调用者,以及到那时将完成多少工作。

同步函数仅在完成其订购的任务后才返回。

另一方面, 异步函数立即返回,命令任务完成但不等待它。 因此,异步功能不会阻止当前执行线程继续进行下一个功能。

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

为了避免保留周期和内存泄漏。

8 —您调用什么GCD方法以异步方式将一些工作传递到队列? 您为此方法提供哪些参数?

dispatch_async(dispatch_get_main_queue(),^ {});

我们将要执行代码的调度队列作为参数传递。

9 —在保持向后兼容性的同时,有哪些方法可以支持较新的API方法或类? 例如,如果您希望视图具有红色tintColor(iOS 7中引入的方法),但是您的应用仍支持iOS 6,那么如何确保它在iOS 6上运行时不会崩溃? 另一个示例是使用NSURLSession与NSURLConnection -您如何做到这一点,以便您的代码使用这两个类中最合适的一个?

  • 将已弃用的API警告视为要解决的错误。
  • 在运行时,检查操作系统版本。
  • objC:使用宏标记旧代码路径。

如果#available(iOS 8,*,*){

self.view.convertPoint(.Zero,toCoordinateSpace:anotherView)

}其他{

self.view.convertPoint(CGPointZero,toView:anotherView)

}

  • 控制3D方库的数量。

您可以在此处详细了解此主题。

10-什么是MVC?

MVC是代表模型视图控制器的设计模式,该设计模式将数据与其显示分开,由视图控制器介导。

11 —什么是代表?

代表是一种设计模式。 委托只是一个对象,当某些事情发生时,另一个对象会将消息发送到该对象,以便该委托可以处理原始对象不是为特定于应用程序的详细信息。 这是一种无需子类即可自定义行为的方式。 重要的是要记住,他们之间存在一对一的关系。

12 —什么是NSNotificationCenter,它如何工作?

Apple提供的NSNotificationCenter是可可库中的观察者模式。 基本思想是,侦听器使用某些预定义的协议向广播公司注册。 在稍后的某个时刻,广播公司被告知要通知所有侦听器,并在广播侦听器上调用每个侦听器的某些函数并传递某些自变量。 这允许异步消息在两个彼此之间不需要了解的对象之间传递,而它们只需要了解广播者即可。

13 —什么是核心数据?

核心数据不是ORM或对象关系映射器。 它也不是数据库。 相反,Core Data是一个对象图管理器,它还具有将对象图持久化到磁盘上的持久性存储中的能力。

14 —什么是托管对象上下文?

托管对象上下文表示Core Data应用程序中的单个对象空间或便笺本。

15 —范围和界限之间的区别?

UIView的边界是矩形,表示为相对于其自身坐标系(0,0)的位置(x,y)和大小(宽度,高度)。

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

16 —复用标识符的目的是什么?

已分配对象的可重用性。

17-首次加载UITableView时分配了多少UITableViewCell? 当您在表格中滚动时,还会分配多少个附加项目?

一个UITableView通常将只分配足够的UITableViewCell对象以显示表中可见的内容。 由于使用了resetIdentifier,因此UITableView不会为滚动到视图中的每个新项目分配新的UITableViewCell对象,从而避免了动画效果。

18-定义原子和非原子。

  • 原子是默认设置:如果您不输入任何内容,则您的属性是原子的。 原子属性可以保证,如果您尝试从中读取内容,则将取回有效值。 它不能保证该值是多少,但是您将获得良好的数据,而不仅仅是垃圾内存。 这允许您执行的操作是,如果您有多个线程或多个进程指向一个变量,则一个线程可以读取而另一个线程可以写入。 如果它们同时命中,则保证读取器线程获得两个值之一:更改之前或更改之后。 原子不会给您任何保证,您可能会获得其中哪些值。 Atomic实际上通常与线程安全混淆 ,这是不正确的。 您需要以其他方式保证线程安全。 但是,atomic可以保证,如果您尝试阅读,则会获得某种价值。
  • 另一方面,您可能会猜到,非原子的意思是“不要做那些atomic事情。”您失去的是保证您总是得到一些东西。 如果尝试在写入过程中进行读取,则可能会获取垃圾数据。 但是,另一方面,您的运行速度更快。 因为原子属性必须做一些魔术才能保证您将获得一个值,所以它们要慢一些。 如果您经常访问该属性,则可能需要降低为非原子属性,以确保不会造成速度损失。

如果您想了解更多有关此的信息,请查看这篇文章

19 —弱者和强者有什么区别?

这些关键字与引用计数相关,如果可以的话,也表示“所有权”。 它们通过限制哪些对象增加另一个对象的引用计数来帮助您消除保留-释放周期。 一个属性是在其中增加对象的引用计数的属性。 如果对象A具有对B的强引用,并且没有其他对象引用B,则B的计数为1(A 拥有或需要存在 B)。 现在,如果B想要引用A,则需要使用一个引用。 弱引用不会增加对象的引用计数。 因此,在这种特定情况下,如果A除了B之外没有其他对象引用它,则在B的引用弱的情况下A的计数将为0。

20 —非运行状态,非活动状态,活动状态,后台状态和挂起执行状态之间有什么区别?

  • 未运行:该应用尚未启动或正在运行,但已被系统终止。
  • 无效:该应用程序正在前台运行,但当前未收到事件。 (尽管它可能正在执行其他代码。)应用程序通常仅在过渡到其他状态时短暂停留在此状态。
  • 活动:该应用程序正在前台运行并正在接收事件。 这是前台应用程序的正常模式。
  • 后台:该应用程序在后台执行代码。 大多数应用在暂停状态下都会短暂进入此状态。 但是,请求额外执行时间的应用程序可能会在此状态下保留一段时间。 此外,直接在后台启动的应用会进入此状态,而不是处于非活动状态。
  • 已暂停:该应用程序在后台运行,但未执行代码。 系统会自动将应用程序移至此状态,并且在执行操作之前不会通知它们。 挂起时,应用程序仍保留在内存中,但不执行任何代码。 当发生内存不足的情况时,系统可能会清除挂起的应用程序而不会发出通知,从而为前景应用程序腾出更多空间。

21 —什么是类别,何时使用?

类别是一种在不扩展类的情况下向其添加其他方法的方法。 它通常用于添加相关方法的集合。 一个常见的用例是在Cocoa框架的内置类中添加其他方法。

22 — viewDidLoad和viewDidAppear有什么区别? 您应该使用哪个方法从远程服务器加载数据以显示在视图中?

加载视图时,无论是从Xib文件,情节提要还是在loadView中以编程方式创建,都会调用viewDidLoad。 每当在设备上显示视图时,都会调用viewDidAppear。 使用哪个取决于数据的用例。 如果数据是相当静态的,并且不太可能更改,则可以将其加载到viewDidLoad中并进行缓存。 但是,如果数据定期更改,则最好使用viewDidAppear进行加载。 在这两种情况下, 都应在后台线程上异步加载数据以避免阻塞UI。

23 — 使用委托通知有什么区别?

两者都用于向相关方发送值和消息。 委托用于一对一通信 ,是Apple提倡的一种模式。 在委托中 ,类引发事件将具有委托的属性,并且通常希望其实现某些协议。 然后, 委托类可以调用委托的协议方法。

通知允许类将事件在整个应用程序中广播给任何感兴趣的方 。 广播类不需要了解有关此事件的侦听器的任何信息,因此通知对于帮助解耦应用程序中的组件非常有用。

24 —在nil指针上调用方法时会发生什么?

发送到nil对象的消息在Objective-C中是完全可以接受的,它被视为无操作。 没有办法将其标记为错误,因为它不是错误,实际上,它可能是该语言的一个非常有用的功能。

25 — 哪个更快:搜索NSArray或NSSet?

当集合中项目的顺序不重要时,NSSet可以提供更好的性能来查找集合中的项目。 原因是NSSet使用哈希值来查找项目(例如字典),而数组必须遍历其整个内容以查找特定的对象。

哇…有很多问题吧? 不用担心,即使是最有经验的开发人员也不是一无所知,重要的是要熟悉一些基本主题,这些主题会在面试时给您带来信心,当然也会使您的潜在雇主有信心雇用您。

如果您想查看更多面试问题和答案,请访问我的博客,其他开发人员也可以在此分享他们的问题!

因此,如果您目前正在面试初级职位,并且被要求提供不在此列表中的内容,请在评论中分享!

希望对您有帮助。

另外,如果您打算使用某个应用程序,并且需要设计和实施方面的帮助,请访问http://startappstudio.com/

和平!