Tag: 面试

50 iOS面试问答第5部分

31-解释主线程检查器 Main Thread Checker是随Xcode 9一起推出的新工具,它可以检测到Apple框架(如UIKit,AppKit等)的无效使用,这些框架本应在主线程中使用,但意外在后台线程中使用。 无效用法的后果可能导致错过UI更新,视觉缺陷,数据损坏和崩溃。 您可以在此处阅读有关主线程检查器的更多信息。 32- Stack和Heap有什么区别? 我们的代码在iOS中占用了一些空间。 它的大小有时是固定的,有时可能会根据用户在程序期间输入的内容而改变。 由于这种差异,我们基本上有两种不同的方法: Stack和Heap 工作结束后,将使用堆栈并自动将其从内存中删除。 但是在堆中,用户可以通过编写用于从内存中删除的手动代码来实现。 堆; 堆栈易于使用。 它保存在计算机的RAM中。 创建的变量退出堆栈后会自动删除。 与堆相比,它相当快。 构造变量可以不使用指针而使用。 堆; 与Stack相比,它相当慢。 如果使用不正确,则会造成内存问题。 变量与指针一起使用。 它是在运行时创建的。 33-解释VIP( Clean-Swift )架构 ViewController通过向其发送请求直接与它交互 。 交互器通过将带有数据模型的Response发送给Presenter来响应这些请求。 Presenter格式化要显示的数据,创建一个ViewModel并通知ViewController它应基于ViewModel更新其View。 ViewController通过在Router上调用方法来决定何时应导航到另一个场景。 路由器执行下一个View Controller的设置,并处理接线,传递数据和委托设置。 与VIPER相比,不同之处在于ViewController本身会联系Router进行导航。 请检查该项目。 34-解释UIBezierPath UIBezierPath类允许我们定义描述任何形状的自定义路径,并使用这些路径来实现所需的任何自定义结果。 35-解释依赖注入容器 容器保留每个类类型到该类实例的映射。 然后,我们可以通过简单地向容器提供类型来实例化任何类。 然后,容器自动为该类提供依赖关系。 36-解释 用于解析JSON数据的 ObjectMapper 对象映射器 将JSON数据转换为强类型模型对象。 它在JSON之间进行双向绑定,并处理通用对象和嵌套对象。 我们也可以管理子类。 37-解释CAShapeLayer CAShapeLayer是CALayer的子类,它提供各种2D形状的硬件加速绘图,并包括额外的功能,例如填充和描边颜色,线帽,图案等。 查看更多详细信息。 38-解释获取请求步骤 […]

iOS开发人员(Swift)的10个最常见问题解答

我去过许多iOS开发人员特定的采访,我被要求解释很多东西而不是编写任何代码。 您可能知道如何构建应用程序或成为编写Swift代码的专家,但这并不意味着您会在iOS开发人员面试中表现出色。 大多数公司在雇用您时都不允许您编写应用程序或编写代码,它们只是问直接的问题,而且需要描述。 因此,请确保您了解开发应用程序时使用的内容。 这是我在iOS开发人员访谈中被问到的10个问题。 我已经从书本和在线资源中收集了答案,并将它们合并在一页上,所以您不会像我一样费劲。 程序需要根据需要分配和取消分配内存。 Swift会自动执行此操作。 Swift不使用垃圾回收器,这是一种常用工具。 ARC是为Obj-C引入的自动引用计数。 一切都是自动管理的,但是您需要了解ARC以避免内存泄漏。 保持周期? 当引用指向另一个引用时,就会发生保留周期,因此它将永远不会从堆中删除。 这主要发生在类和闭包中。 闭包存在于内存中,因此当您使用Self(作为参考)时,需要确保解决保留周期。 弱,无主,强? 除非您另外指定,否则所有Swift属性都是强大的,这意味着除非拥有它们的任何东西都从RAM中删除,否则它们不会从RAM中删除。 另一方面,当您想说“我希望能够引用此变量,但我不介意它消失了,所以我不想拥有它”时,它就很弱 。这看起来很奇怪:毕竟,引用可能不存在的变量有什么意义? 无所有权的意思是“不要介意这个,我将确保将其从内存中删除。” Model-View-Controller是基于三个作业类别的设计模式:模型,视图或控制器。 模型 :模型负责存储数据并使数据可用于其他对象。 视图 :视图是应用程序的视觉元素。 您在屏幕上看到的内容。 控制器 :控制器执行必要的逻辑,以连接您的视图和模型。 他们处理事件。 在开发应用程序时,您可以使用不同类型的设计模式,但这是最常见的设计模式。 Singleton :Singleton设计模式可确保给定类仅存在一个实例 Singleton Plus:您可以创建另一个对象。 不会强迫您使用共享的。 Facade :Facade设计模式提供了到复杂子系统的单个接口。 假设您有NetworkManager类,可以在其中发出HTTP请求,并且具有JSON响应。 使用Facade,您可以使NetworkManager只专注于网络。 装饰器:装饰器模式可向对象动态添加行为和职责,而无需修改其代码。 适配器:适配器允许具有不兼容接口的类一起工作。 它将自己包裹在对象周围,并公开一个标准接口以与该对象进行交互。 观察者 :在观察者模式中,一个对象将任何状态更改通知其他对象。 可可以两种方式实现观察者模式:通知和键值观察(KVO)。 主要区别在于值类型在传递时会被复制,而引用类型共享引用信息的单个副本。 一个可选的用来让任何类型的变量代表缺乏价值 。 可选变量可以随时保存值或nil。 类支持继承, 结构不支持。 类是引用类型, 结构是值类型。 强制拆包 ! […]

Swift iOS访谈:关于闭包和功能的所有信息

函数: 函数是执行特定任务的自包含代码块。 功能具有三种类型。 全局功能:具有名称,但不捕获值。 嵌套函数:具有名称和捕获值 闭包:(函数的特殊类型)没有名称,但可以获取值 ######################################## 闭包 :闭包是自包含的功能块 ,可以在代码中传递和使用。 闭包可以从定义闭包的周围环境中捕获任何常量和变量的引用 。 闭包类似于lambda和block ######################################## 转义闭包:将闭包传递给函数但在函数返回后调用。 闭包可以转义的一种方法是将其存储在函数外部定义的变量中。 ######################################## 非转义闭包:当闭包传递给函数但在函数返回之前调用。 默认情况下,非转义关闭是关闭类型。 在非转义中,我们可以使用self,因为闭包是在函数返回之前执行的,因此self肯定会存在。 ######################################## 自动闭包:自动闭包是一种闭包,它是自动创建的,用于包装作为参数传递给函数的表达式。 调用时它不接受任何参数,但返回包装在其中的expression的值。 func f(pred:@autoclosure()-> Bool){ 如果pred(){ 打印(“这是真的”) } } f(pred:2> 1) //真 ######################################## 尾随闭包:如果需要将长闭包表达式作为最终参数传递给函数,则建议将其作为尾随闭包传递。 在函数调用的括号后面写上结尾的闭包,即使它仍然是函数的参数。 func sum(从:Int,到:Int,闭包:(Int)->(Int))-> Int { var sum = 0 因为我从…到{ 总和==闭包(i) } 返还金额 } //正常关闭通话 sum(从:0,到:5,闭包:{ $ 0 * 10 […]

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面试题

Подолгуслужбыяпровожуоченьмногоинтервью。 Иненарядовыепозиции。 Какправилоясобеседуюпотенциальныхтеч-лидовисиньорразработчиков。 Ксожалению,этибеседыприносятмнемногоболи。 Почтипослекаждойстыдзапрофессии, Иещёодиночество) Вцеломядажепонимаюпочемутак。 Вмобильнойразработке(хотянетольковмобильной)всеслишкомпривыкликприложениямсодной Написалзамесяц,забралбаблоизабыл。 Понятно,чтотутненужнобытьсупермозгом,этопростоконвейер。 Такаяработанеспособствуетразвитиютехническихнавыковидовольносильноотупляет。 Потомуярешилнаписатьэтотчек-лист。 Можетбытьонпоможеткомутонемногорасширитьгоризонт。 Нуипройтисобеседование。 Допускаю,чтомногиескажут“этожеэлементарныевещи,списокпростой”! Да,неспорю,такиесть。 Проблематольковтом,чтонанёмсрезается95%кандидатов。 Темчтоостались,можноделатьоффер,скореевсегоонибудутработатьхорошо。 Итак,список。 Разницамежду值类型和引用类型? 数组,字典,集合-值还是引用类型? 模式CopyOnWrite。 Вчёмидея? Какреализуется? 面向协议的编程-要点 ОсновныепроблемыООПподхода? Почемуонтеряетпопулярность? 扩展程序—是чмосновнаяидея? Можноливпотомкахпереопределятьметоды,определённыев扩展名? Почему? 高阶函数 差异beetwen地图和flatMap ЗачемнужныDispatchGroups? DisтотакоеDispatchWorkItem? Proтотакоепаттерн承诺/未来? 迅速在Практическоеиспользование。 未完待续… Испециальныевопросына“ Appleэрудицию”: WWDC的Любимыйдокладнапоследнем? Чтозапомнилось? 是iOS 11吗? 斯威夫特4(Swift 4)? Меняособоогорчаетиудивляет,когдапрофессиональныеiOSразработчикиговорят,чтонесеоерелиWWDC ,тостыдно,парни..Этожевашаработа。

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 —在视图出现之前立即调用,非常适合隐藏/显示字段或您希望在视图可见之前每次进行的任何操作。 […]

Swift iOS访谈:关于财产和财产观察员的一切

属性:属性是与特定类,结构和枚举关联的值。 属性基本上是两种类型。 1.储存财产: 存储属性可以存储变量和常量。 存储类和结构给出的属性。 商店属性无法在扩展名中定义。 2.计算财产: 计算属性是计算而不是存储。 由类,结构和枚举给出的计算属性。 计算属性始终是可变的。 计算属性提供getter和可选的setter 懒惰的存储属性: 直到使用时才计算其初始值的属性。 惰性存储的属性始终是可变的。 惰性属性的应用:属性的初始值取决于外部因素 , 而外部因素的值直到实例初始化完成后才知道。 GPS类{ 在里面() { 打印(“正在初始化GPS …”) } } 车类{ 惰性变量导航= GPS() } var car = Car() 在上面的示例中,在每种情况下都不需要导航属性。 物业观察员: 财产观察员观察并响应财产价值的变化。 每当值改变时都会调用它。 可以在存储属性(懒惰存储属性除外)上定义属性观察器。 可以为覆盖的存储和计算的属性定义属性观察器。 属性观察者不需要为非覆盖的计算属性定义。 类型属性:(静态) 不管您创建了多少个该类型的实例,这些属性只有这些属性的一个副本。 Type属性不能被覆盖。 您必须始终为存储的类型属性提供默认值。 静态 varstoredTypeProperty =“ Animesh” struct SomeStructure { static varstoredTypeProperty =“某些值。” 静态 var […]

iOS面试问题🤯😖😒

1.我们在Objective-C中有扩展吗? 答案是肯定的。 2.目标C中类别和扩展名之间的区别? 可以为任何类声明一个类别,即使您没有原始的实现源代码。 类扩展与类别具有某些相似性,但是只能将其添加到您在编译时拥有源代码的类中(该类与该类扩展同时进行编译)。 类别使您可以在主界面文件之外添加方法。 而扩展名必须在主接口文件中实现。 这意味着我们可以确定,您不能使用扩展来扩展内置类或没有源代码的类,而应该使用类别。 要使用扩展,您需要访问要扩展的类的源。 3. Fallthrough关键字很快? 在Swift中, switch语句不会落入每种情况的底部而进入下一种情况。 即,第一个匹配的情况一旦完成,整个switch语句就完成其执行。 快速地,在切换案例中使用fallthrough语句来执行case语句,根据我们的要求,case语句位于匹配的case语句旁边。 fallthrough关键字不检查导致执行陷入的switch条件的条件。 fallthrough关键字仅导致代码执行直接移至下一个case(或default case)块内的语句,就像C的标准switch语句行为一样。 4.如何使协议中的方法快速可选? 我们可以通过两种方式做到这一点。 纯快捷方式应类似于使用protocol extension提供默认实现。 目标— C兼容性的方式是使用@objc和optional关键字。 重要: objc的缺点-兼容性方式是上MyProtocolObjc 中的 MyProtocolObjc 成为一个类-仅协议 。 结构不符合该协议。 错误: 非类类型’SomeStruct’不符合类协议’MyProtocolObjc’ 5.反转字符串而不使用“ reversed()”内置函数 如果面试官要求您将代码写在纸上,请当场杀死他。 对我来说,没有xcode编写优化代码真的很困难。 上次问这个问题时,这是我首先想到的。[笔和纸的方法]。 扩展字符串{ func reverse()->字符串{ var tempString =“” 对于自我中的字符{ tempString =字符串(char)+ tempString } 返回tempString } } 我能够剪切-使用Playgrounds将其拍摄到Playgrounds 。 您可以在字符串上使用高阶函数“ […]