Tag: 面试问题

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

希望您喜欢这些文章及其对您的帮助,让我们从10月的第1部分开始。 对于旧月份:请检查— 2018年IOS面试常见问题解答 回答:这是两个或多个任务可以独立运行的条件,即使其他任务也同时执行。 NSOperation和NSOperationQueue 大中央派遣(GCD) 队列类型 定义队列类型对于获得所需的结果很重要,并且将有助于确定代码块的执行方式。 同步 :执行过程中当前线程将被阻塞 异步 :任务将在后台线程上运行,使当前线程可用于其他任务 串行 :串行队列一次执行一个块,顺序按输入顺序(FIFO —先进先出)。 您可以创建多个串行队列。 如果您有四个串行队列,它们可以同时异步运行所有四个任务,优点是您可以控制代码块的执行顺序(FIFO),并且它们在每个串行队列上都是线程安全的。 并发 :并发队列有可能一起执行这些块(一次默认为2个块),从而允许进程并行运行。 缺点是您可能无法完全控制哪些任务最先完成。 以下是5个全局队列及其对应的QoS类,它们提供了有关其功能的更具体定义。 回答:我们将介绍以下内容: RETAIN , RELEASE , AUTORELEASE RELEASE , ALLOC , DEALLOC , COPY和NSAUTORELEASEPOOL 。 手动参考计数 Objective-C中的内存管理涉及四个基本规则。 如果遵循这些规则,则不会泄漏内存或导致指针悬空。 规则1.如果您使用“ ALLOC”,“ COPY”或“ NEW”开头的方法创建对象,那么您就拥有它。 在这里您创建了一个保留数为1的新对象,这自动使您成为所有者。 规则2.如果您 RETAIN 对象,那么就拥有它。 在这里,您可以在对象上调用retain ,这会使保留计数增加一。 规则3.如果拥有,则必须发布。 在这里,您可以在对象上调用release方法,从而将保留计数减少一。 当您调用release且保留计数达到零时,对象将通过调用dealloc释放自身。 这意味着您永远不要 直接 调用 dealloc […]

如何在技术面试中提问

在最近的一篇文章中,我提供了准备工作时要考虑的事项的概述。 技术面试。 该内容的一部分已扩展为视频,包括一个用于进入白板时回答棘手问题的基本框架。 即使我专门研究iOS开发 ,该过程也足够通用,因此可以应用于任何编程语言: 提出澄清问题 创建一个概念图 在伪代码中表达蛮力解决方案 使用可行的代码优化您的解决方案 检查错误或遗漏 当在时间限制下编码或处理不熟悉的主题时,遵循一组预定义的步骤变得尤为重要。 让我们看看如何使用此过程来回答以下问题: “ ..您将如何设计一个Stack类,除了push和pop方法外,它还具有一个属性计数,该计数返回元素的数量? 推,弹出和计数都应在O(1)时间内进行。” 什么是堆栈? 作为iOS开发人员,我们习惯于使用Swift和iOS SDK来构建用户界面元素,流程和应用。 这个问题提供了价值,因为候选人(正确地)假设Stack不是开发中通常使用的东西。 从候选人的角度来看,这个问题的答案可以将管理UITableViews的日常活动与UINavigationController联系起来 。 什么是O(1)时间? 这个答案将揭示人们应该如何考虑算法的性能。 通过了解恒定时间的重要性-O(1),他们将看到以相同速度执行的流程具有显着的优势-无论其输入大小如何。 即使在面试中问这个问题是最好的做法,但事先学习Big O Notaton也会带来很多好处。 大声思考 我们都听说过这个,但是在实践中,很难遵循。 在解决问题以最终找到解决方案的过程中,我们需要让面试官知道我们的想法-即使我们的想法看起来很愚蠢或半生半熟。 在大多数情况下,面试官希望您成功,因此他们将寻找机会引导您朝正确的方向发展。 没有任何口头反馈,他们将无能为力。 众所周知,这通常是在事情变得紧张而尴尬的时候。 优化您的解决方案 在面试中编写代码时,最好的做法是编写一个“可行”的基本解决方案,然后继续完善其语法和功能。 在性能方面,这通常会转化为在O(n)甚至O(n2)处构建可行的解决方案。 这个两步过程不仅提供了收集您的想法的机会,而且还使面试官知道您处在正确的轨道上。 最后,当您将代码重构为最终解决方案时,请问自己,如果必须处理1M数据行,该算法将如何执行? 重新定义问题通常可以使您的解决方案的各个部分看起来很扎实,但可以进一步加以改进。 代码 这是在Swift中实现的完整Stack类: //恒定时间操作-O(1)类Stack { var store:[T] = [] func peek()-> T? { 返回store.last } func push(_ […]

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

希望你们喜欢本系列的第1部分。 让我们在第2部分中探讨更多面试问题。 如何用约束为视图制作动画? 您需要在动画块内调用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 —在视图出现之前立即调用,非常适合隐藏/显示字段或您希望在视图可见之前每次进行的任何操作。 […]

Xcode10中针对开发人员的新增功能

xcode 10,采访,iOS,iOS应用采访 您是否想知道自从迁移到Xcode 10以来对象/媒体库发生了什么? 对象浏览器每次使用时都会消失吗? 采访者真的很高兴向您询问有关Xcode 10的更改,以下是一些快速的Xcode 10库技巧,可以使您恢复平静。 简而言之: 暗模式 对象库和代码段库 编辑器过度滚动 更改突出显示 代码折叠色带 多光标 与Bitbucket,Gitlab的源代码控制集成(去年GitHub) 专为机器学习打造的游乐场 并行测试:XCTest和XCUITest Xcode 10新旧版构建系统 让我们从头开始,尝试理解并记住这些要点。 1.暗模式界面和Mac App支持 暗模式仅在macOS 10.14 Mojave上可用。 转到System Preferences > General然后更改Appearance 。 2.对象库和摘要库 新按钮是上下文相关的,因此您会注意到在Interface Builder中无法访问代码段,而在文本编辑器中则无法访问对象库。 使用Interface Builder时 ,您将获得一个打开对象浏览器的按钮: 在源代码编辑器中,您将获得一个打开代码段编辑器的按钮: 3.编辑器过度滚动 过度滚动可轻松使最后一行的代码居中显示在屏幕中间。此功能默认情况下仅在代码编辑器内最后一行的底部提供额外的空间, 并使最后一行居中 。 4.更改突出显示 在编辑器中直接突出显示本地存储库或共享服务器上游的更改。 一目了然,您将看到: 您的代码中所做的更改。 更改尚未推送到共享存储库。 其他人所做的上游更改。 提交冲突之前,您应该先解决冲突。 6.多光标 在您的代码编辑器中放置多个光标,即可一次进行许多更改。 要编辑文档不同部分中的多个文本实例,可以使用多光标编辑。 这允许将多个光标放置在不同的位置,以便可以添加,修改或删除文本。 Xcode 10源代码编辑器现在支持多光标编辑,使您可以一次快速编辑多个代码范围。 […]

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。 […]

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

iOS最新面试题 在本文中,我要向iOS开发人员添加最近问到的新问题,让我们开始吧。 Q1。 什么是NSZombie? 当您的iPhone应用程序因“错误访问”而崩溃时,您将遇到麻烦–内存错误,您试图在已删除的对象上调用方法。 Instruments拥有对NSZombie的支持-通过向您显示导致崩溃的对象的每个分配,保留,释放和自动释放的完整历史记录,可以轻松地找到错误的来源! 哇。 它是内存调试的辅助工具。 具体来说,当您设置NSZombieEnabled时,只要对象达到保留计数0,而不是将其释放,它就会将自身变形为NSZombie实例。 每当此类僵尸收到消息时,它都会记录警告,而不是以无法预测的方式崩溃或行为。 这样,您就可以调试细微的过度发布/自动发布问题,而无需使用高级工具或在干草堆搜索中费尽心思。 这个名称是一个相当明显的玩法,因为当对象达到保留计数0时,它们通常被视为“死”。在这种设置下,它们继续以奇怪的半衰期存在-既没有生命,也没有死亡。 就像真正的僵尸一样,除了它们的大脑吃得更少。 Q2。 什么是线程清理和静态分析? 线程清理程序将帮助您查找数据争用和其他并发错误。 静态分析器已扩展为搜索可定位性问题,检查为空性以及在MRR代码中查找内存泄漏。 Q3。 什么是延期调用? 编写示例代码? 使用libdispatch,计时器的最简单形式是DispatchQueue.asyncAfter 。 这是“延迟调用”的一种形式,它仅延迟函数但不返回引用,因此不提供取消的可能性。 基本的调用after可能看起来像这样: DispatchQueue.global()。asyncAfter(最后期限:DispatchTime.now()+ .seconds(10)){ //一些延迟的代码 } Q4。 什么是调度源? 调度源是一种基本数据类型,可协调特定底层系统事件的处理。 大中央调度支持以下类型的调度源: 计时器调度源生成定期通知。 UNIX信号到达时, 信号分发源会通知您。 描述符源会通知您各种基于文件和套接字的操作,例如: 当数据可供读取时 何时可以写入数据 在文件系统中删除,移动或重命名文件时 文件元信息更改时 流程调度源会通知您与流程相关的事件,例如: 进程退出时 当进程发出fork或exec类型的调用时 当信号传递到过程时 Mach端口调度源会通知您与Mach相关的事件。 自定义调度源是您定义并触发自己的源。 Q5。 什么是应用程序稀疏? App Store和操作系统通过根据用户特定设备的功能量身定制应用程序交付,从而以最小的占用空间优化了iOS,tvOS和watchOS应用程序的安装。 这种称为应用程序细化的优化,使您可以创建使用最多设备功能,占用最少磁盘空间并容纳Apple可以应用的将来更新的应用程序。 更快的下载速度和更多空间可用于其他应用程序和内容,从而提供更好的用户体验。 切片 切片是为不同目标设备创建和交付应用程序包变体的过程。 变体仅包含目标设备所需的可执行体系结构和资源。 […]

代码挑战:在Swift中遍历数据结构

最近,我有机会帮助iOS面试计划的学生为大多数人认可的公司准备了一次重要的技术面试。 总体而言, 我的课程融合了代码挑战和实时白板会话的组合,测试了人们在Swift中实现语法,设计模式和算法的能力。 挑战 有时,我会听到人们回覆他们的采访经历。 有时,某些类型的问题会使开发人员感到惊讶。 如果您意识到了挑战,那就太好了! 对于我们其他人,这里是摘要: //给出以下树: // 1 // 2 3 // 4 5 7 // 8 9 //由此类实现: 类 基站 { var键:T? 左变数: 基站 ? 右: 基站 ? var高度: 整数 在里面() { 自。 高度 = -1 } } //使用以下函数获取以下输出: //预期输出: // 1 // 2 3 // 4 5 7 // 8 […]

使用Swift了解哈希表,字典和集合

在帮助iOS开发人员准备技术面试时,我经常讨论哈希表。 由于效率高,哈希表是候选人在应对编码挑战以及实际应用程序时应考虑的出色工具。 在本文中,我们将探讨哈希表的概念,并将其与其他集合类型(例如字典和集合)进行比较。 词典 要了解为什么哈希表很有用,应该熟悉它们的设计。 当被问到时,许多学生都认为“哈希表就是字典”。为验证这一点,让我们回顾一下标准的Swift字典类型: 变种 清单= 字典 ()//添加字典值-恒定时间O(1) list [“ WB”] =“ Wayne Bishop” list [“ FB”] =“弗兰克·霍布斯” list [“ LP”] =“拉里·佩奇(Larry Page) list [“ AE”] =“阿尔伯特·爱因斯坦” //检索密钥 对于 s在list.keys { 打印 (秒) } //获取值 对于 v在list.values { 打印 (v) } //通过键获取值-恒定时间O(1) 让 item = list [“ WB”] //收回“ Wayne Bishop” 词典是处理许多情况的有用类型。 由于键和值都是在运行时提供的,因此可以编写例程来检索单个键,值或它们的混合。 […]

如何准备在Facebook进行技术面试

自启动iOS面试计划以来,我有机会与许多有兴趣在Facebook工作的学生一起工作。 结果,我对他们的招聘过程产生了浓厚的兴趣。 与Google和Amazon类似,他们的采访“循环”以其冗长而详尽的经历而闻名。 我最近访问了他们在西雅图的新办公室,就他们如何建议候选人准备技术面试进行非正式讨论。 本文提供提示,注释和建议。 行为要点 参加Facebook的采访活动时,我的目标是掌握最新技术,并在指导他人时微调我的方法。 我很高兴学习他们的过程从三个方面进行评分。 行为阶段旨在了解候选人。 这包括优点,缺点和目标。 突出的是他们强调寻找能够证明自己如何从失败的项目或处于危险中的项目中恢复过来的人。 这些事件揭示了候选人的态度,行为和外貌,而不仅仅是提供标准的样板反应。 Facebook寻求能够表现出流行的快速失败心态并且不怕冒险的人。 最佳脚步向前 重点是看到他们的技术面试过程的现场演示,演示者/开发者在100多人的观众面前白板解决方案。 在Facebook实际的5到6个小时的采访中,大约一半的时间将花费在完成编码挑战上。 结果,强调了候选人利用时间发挥自己的最大作用。 挑战 在Facebook上,给候选人约45分钟的时间来解决每个编码问题。 考虑到时间限制,他们建议通过提出正确的问题来给人留下深刻的印象,然后在优化设计之前继续实施蛮力方法。 只要您能够详细说明它们的性能,就可以接受使用特定API或语言功能解决挑战的方法。 为了说明这一点,让我们重新讨论在创建算法以检测字符串中的唯一字符方面的代码挑战。 签名如下: //挑战:编写一个函数来确定输入的String(例如元素)是否包含所有唯一字符。 功能 isStringUnique (元素: 串 )-> 布尔 { //代码在这里。 } 与大多数代码一样,有许多可能的方法。 在本文中,我回顾了如何通过应用蛮力方法解决该问题,然后继续优化代码,使其在线性时间(O(n)或更佳)下运行。 没有讨论的是纯粹使用本机Swift API或语言功能来解决它​​。 有趣的是,这种看似简洁的解决方案也满足了我们的要求: 功能 isStringUnique (_ s: 串 )-> 布尔 { 返回s.count == 组 (s).count } 乍看之下,代码看起来很棒,但确实是最佳答案吗? 更重要的是,考虑到典型面试的压力,人们是否有能力证明或否认其效率? 现在的课程是-较少关注语法,而是通过证明您的方法来努力展示您的知识。 系统设计 […]

了解Swift闭包语法

尽管我鼓励开发人员为技术面试做准备,主要侧重于解决问题的方法 ,但关闭过程非常复杂,需要仔细研究。 在这个挑战中,我们的目标是创建一个名为operation()的辅助函数,该函数将把times()函数用作参数 。 如下所示,times是一个简单的函数,它返回两个输入参数的乘积: //挑战:编写一个名为operation()的新函数,该函数将times()函数用作参数。 功能 次(lhs: 整数 ,rhs: 整数 )-> 整数 { 返回lhs * rhs } 一流 成功解决此挑战需要了解Swift语法。 首先,我们应该认识到特定对象(例如枚举 , 协议和功能 )通常是与其他语言一起使用时受到限制的,它们是一等公民 在Swift中。 因此,Swift允许我们像使用标准Int或String类型一样使用它们。 由于函数可以包含参数和返回类型,因此这使得将它们表示为Closures较为详细。 考虑以下: 功能 次(lhs: 整数 ,rhs: 整数 )-> 整数 { 返回lhs * rhs } 功能 操作 (公式:( 整数 , 整数 )-> 整数 ){ 让 结果=公式(2,3) print(result)//打印6 } //时间用作参数。 操作(公式: […]