IOS面试常见问题解答(2018年11月)第1部分

资深iOS开发人员面试问题,面试问题,经验丰富的ios面试问题

对于旧月的问题,请转到iOS面试问题2018系列

让我们开始🙂

Q1。 您如何在UserDefaults中保留文件引用,即如何存储对文件的引用,以便即使文件从一个文件夹移动到另一个文件夹,也可以访问它?

解决方案:文件URL指定文件系统中的位置。 如果使用set(_:forKey:)方法存储特定文件的位置,并且用户移动了该文件,则您的应用在下次启动时可能无法找到该文件。 要通过文件的文件系统标识存储对文件的引用,您可以改用bookmarkData(options:includingResourceValuesForKeys:relativeTo:) NSURL bookmarkData(options:includingResourceValuesForKeys:relativeTo:)方法创建NSURL书签数据,并使用set(_:forKey:)方法将其持久化。 然后,您可以使用URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:方法将用户默认存储的书签数据解析为文件URL。

Q2。 与CoreData或SQLite之类的东西相比,在NSUserDefaults中存储东西的成本是多少?

解决方案:在NSUserDefaults中存储内容基本上有两个成本:

1)要么全部存储在内存中,要么都不存储在内存中(从技术上讲,如果您使用-initWithSuiteName:您可以单独对其进行管理,但通常情况下它全部或全部都不存在)。 因此,如果您在偏好设置中有一堆无关紧要的东西,它将与您检查的布尔值一起加载。

2)同样,所有这些都立即更新。 如果您设置了这个小布尔值,则整个文件将再次保存到磁盘中(尽管:它稍后会在后台程序中将其保存到磁盘中,因此不一定会使您的程序变慢。尽管如此,它仍然不是免费的) 。

由于您只存储了极少量的东西,因此这对您都不重要。 如果您最终存储了更多的东西,那么这两个地方(内存使用情况和设置新值的时间)将由您支付。 从用户默认值读取值几乎总是非常快,几乎与存储多少无关。

另一个随机的NSUserDefaults性能提示:在用户默认值内部的集合内设置值比在用户默认值中直接设置相同值要昂贵。 这样保持事物“平坦”会有帮助。

Q3。 @synchronized如何工作?

解决方案:查看源代码之后,您会发现有更多事情要做。 苹果最多使用三个锁定/解锁序列,部分原因是它们还添加了异常解除功能。 与自旋锁方法相比,这将是一个放缓。 由于设置属性通常很快,因此自旋锁非常适合这项工作。 当您需要确保可以在不导致代码死锁的情况下引发异常时, @synchonized(self)很好。

为了找出@synchronized作用,我看到了这样的内容:

Q4。 黑白之间的差异ScheduledTimerWithTimeInterval&timerWithTimeInterval吗?

解决方案:计划的计时器会自动添加到运行循环中,而未计划的计时器则不会。
计时器功能相同。

因此,如果计时器不是默认运行循环(timerWithTimInterval)的一部分,它将触发什么?

NSRunLoop的方法addTimer:forMode:

用更具描述性的方式:

ScheduledTimerWithTimeInterval:invocation:repeats :和 ScheduledTimerWithTimeInterval:target:selector:userInfo:repeats

创建自动添加到NSRunLoop的计时器,这意味着您不必自己添加它们。 将它们添加到NSRunLoop是导致它们触发的原因。

timerWithTimeInterval:invocation:repeats :和timerWithTimeInterval:target:selector:userInfo:repeats

您必须使用以下代码将计时器手动添加到运行循环中:

[[NSRunLoop mainRunLoop] addTimer:repeatingTimer forMode:NSDefaultRunLoopMode];

Q5。 哪个更快— NSArray与NSSet?

解决方案:是的,NSArray在保持和迭代方面要比NSSet快。 构造速度快50%,迭代速度快500%。 课程:如果只需要迭代内容,请不要使用NSSet。

当然,如果您需要测试Lookup,请尽量避免使用NSArray。 即使您需要迭代查找测试,您也可能仍应选择一个NSSet。 如果需要保持集合有序并测试查找,则应考虑保留两个集合(一个NSArray和一个NSSet),每个集合包含相同的对象。

Q6。 快速执行代码的切入点是什么?

解决方案:对于iOS应用程序,新的iOS项目模板的默认设置是将@UIApplicationMain添加到常规Swift文件中。 这将导致编译器为您的iOS应用程序合成一个主入口点,从而消除了对“ main.swift”文件的需求。

Swift旨在简化在操场上的实验或快速构建脚本的过程。 完整的程序可以是一行代码。 当然,Swift还旨在扩展到您可以梦想的最复杂的应用程序。 使用“ main.swift”,您可以完全控制初始化,也可以让@UIApplicationMain在iOS上为您完成启动工作。

希望你喜欢,转到iOS面试问题2018系列

参考文献:

  1. https://developer.apple.com/documentation/foundation/userdefaults
  2. http://googlemac.blogspot.com/2006/10/synchronized-swimming.html
  3. https://www.cocoawithlove.com/2008/08/nsarray-or-nsset-nsdictionary-or.html
  4. https://developer.apple.com/swift/blog/?id=7