Tag: Ios面试问题

针对开发人员/高级开发人员的iOS面试问题

在本文中,我将介绍与iOS面试有关的大多数问题和答案。 它一定会在某种程度上帮助您。 开始吧。 Q1。 swift和目标C有什么区别? 什么是手动保留周期? 内存管理如何快速工作? 如何检查协议的可选方法在继承的类中实现? 什么是面向协议的编程? MVVM与MVC? 如何快速实施收款? NSArray vs Array? 您将如何在用户默认值中存储自定义对象? https://medium.com/ios-expert-series-or-interview-series/top-ios-interview-questions-and-answers-august-2018-5cc89eb67160 Q2。 为什么@ property / @ synthesize不存在? 如何实现可选功能? 为什么网点薄弱? 您将如何修改init函数中的let变量? 什么是隐式展开可选项? https://medium.com/ios-expert-series-or-interview-series/top-ios-interview-questions-and-answers-august-2018-part-2-9aa313dd04f2 Q3。 如何快速创建抽象类? https://medium.com/ios-expert-series-or-interview-series/how-to-create-an-abstract-class-in-swift-f8ebdc30e26 Q4。 黑白Delegate和DataSource有什么区别? https://medium.com/ios-expert-series-or-interview-series/top-ios-interview-questions-and-answers-august-2018-part-3-4868552831f4 Q5。 快速编写通用单例类? 什么是仅类协议? 快速的静态函数与类函数? https://medium.com/ios-expert-series-or-interview-series/top-ios-interview-questions-and-answers-august-2018-part-4-b5bb73d9b3d6 Q6。 DIspatchQueue中有哪些不同类型的队列? 什么是坚实原则? 什么是依赖注入? https://medium.com/ios-expert-series-or-interview-series/top-ios-interview-questions-and-answers-sept-2018-383dc3bbda67 Q7。 什么是适配器,责任链,装饰者,委托,外观设计模式? https://medium.com/ios-expert-series-or-interview-series/design-patterns-on-ios-7523230f3d31 Q8。 黑白手动和自动参考计数不同? 什么是并发,有多少种实现方法? https://medium.com/ios-expert-series-or-interview-series/top-ios-interview-questions-and-answers-oct-2018-c98e8821ff6c Q9。 MVC vs MVP vs […]

第四天:什么是快速落败?

如果要转到 第3天的 上一篇文章 ,或者要从 第1天 开始 。 有趣的故事 :我在一家知名公司的采访中,他们进行了第一轮的客观类型问题,有四个选择。 一个特别的问题(或您可以说的选项)引起了我的注意,该问题是基于开关控制流的问题,它有一个选项是失败。 我认为这是打印错误,在Swift中没有一个名为fallthrough的关键字。 面试刚结束,我就意识到自己是多么的傻瓜。 重新营业! 如果您使用C风格的语言进行过任何编程,则将特别记住开关控制流程中的一个非常不安全的功能,即如果我们不(或偶然地错过了,我经常这样做)在案例结束后写断点 ,那只会在接下来的情况下驳船? (谁给我一些隐私,bru?) 显然, Swift是更安全的语言,它的默认特性不是那样,而是更简洁 , 可预测,并且避免错误地执行多个切换案例 。 但… 如果您想在Swift中使用(C样式)功能,则需要在每次 您需要的情况。 Swift编程语言书中的示例 失败 最后一件事,也是最重要的 fallthrough关键字不检查导致执行陷入的switch条件的条件。 fallthrough关键字仅导致代码执行直接移至下一个case(或default case)块内的语句,就像C的标准switch语句行为一样。 那是一个问题,明天见。 如果您在本文中❤️,请给我一个give,并支持我的工作。 等等,要继续吗? 转到第5天 。 没有人会知道!

iOS面试问答

在这个故事中,我将分享与IOS开发相关的采访问题。 希望您会找到很多有用的信息。 我们为什么应该录用你? 在面试中专注于代码。 您想展示自己的技能,但是最终公司对您对代码的了解以及花费在研究和学习更多时间上的时间感兴趣。 尽管问题和答案可能是技术性的,但记住要向您的准雇主表明您是人也是很重要的。 为技术性添加一些色彩,加入您喜欢的开发人员双关语,并了解您的知识-这是一个成功的组合,一定会让您梦想中的iOS演出。 命名用于构建iOS应用程序用户界面的框架? UIKit框架:UIKit框架提供了事件处理,绘图模型,窗口,视图和控件,这些控件是专门为触摸屏界面设计的。 您如何响应应用程序的状态转换? 通过在应用程序的委托对象上调用相应的方法,状态转换可以以适当的方式响应状态更改。 ApplicationDidBecomeActive()方法可用于准备作为前台应用程序运行。 当应用程序在后台运行时,可以使用ApplicationDidEnterBackground()方法执行一些代码,并且可以随时将其挂起。 当您的应用程序移出后台时,可以使用ApplicationWillEnterForeground()方法执行一些代码 当您的应用终止时,将调用ApplicationWillTerminate()方法。 iOS 9中添加了哪些功能? 1 —智能搜索和Siri- 2-更深入的搜索功能 3-旧金山字体, 4 —可选的iCloud Drive应用程序 保留和分配之间有什么区别? 分配创建从一个对象到另一个对象的引用,而不增加源的保留计数。 保留创建从一个对象到另一个对象的引用,并增加源对象的保留计数。 在UIView中指定元素布局的不同方式有哪些? 1 —使用InterfaceBuilder — XIB文件 2-具有NSLayoutConstraint的自己的视图,该视图按自动布局进行排列 3 —(id)initWithFrame:(CGRect)frame方法。 什么是原子性质? 确保始终返回完全初始化的对象。 什么是单例课程? 在应用程序中仅创建该类的一个实例。 Objective-C是否包含私有方法? 否,如果您确实想要私有方法,则需要添加本地类别/未命名类别/类扩展 什么是plist? Plist是指属性列表,该属性列表将数据组织为命名值和使用多种对象类型的值列表 复用标识符的目的是什么? 在UITableView中使用相似的布局但内容不同 “ app ID”,“ Team ID”和“ bundle ID”之间有什么区别?它们分别是做什么用的? 应用程序ID是两部分的字符串,用于标识单个开发团队中的一个或多个应用程序。 该字符串由Team ID和bundle […]

iOS面试问题:基础知识

是的,许多伟大的作者已经讨论了这个话题,他们有很多的问题和答案。 在我的这篇文章中,我没有做任何不同的事情,尽管我认为分享我的采访经历会很棒。 那么从哪里开始呢? 诚实的答案将来自“ 基础知识 ”。 而且基础是Oops概念。即面向对象的编程概念。 如果面试官是有经验的人,他或她肯定会从此开始。 因此,在本文中,我们将介绍Oops概念。 对于与此相关的问题,我们应该准备好至少一个衬纸答案,并在需要时提供示例。 问:什么是面向对象编程? 面向对象编程是一个概念,它涉及现实世界中的对象以及操作这些对象的方法。 目标C / Swift中的基本概念: 类 :类是一组属性和方法。 //迅速 类Person:NSObject { var firstName:字符串? var lastName:字符串? var age:整数? func printFullName(){ //一些要打印的代码 } } // Objective-C @interface Person:NSObject @ property(强原子)NSString * firstName; @property(强原子)NSString * lastName; @property(assign,atomic)int age;-(void)printFullName; @结束 对象 :对象是类的实例。 //迅速 var person1 = Person()//目标C 人* person1 = […]

IOS面试问答(2019年1月)第3部分

iOS面试题2019 本文包括来自VMware的有关IOS职位的更多问题。 希望对您有帮助。 下一篇: IOS面试常见问题解答(2019年1月)第4部分 如有其他疑问,请查看以前的文章-2018/2019年度IOS面试常见问题解答 Q1。 您使用了哪个应用程序,为什么使用了MVVM,MVC? 回答 : MVVM 首先,关键优势在于实现view和model之间的真正分离。 实际上,这意味着如果/当您的模型需要更改时,它可以不需要视图,反之亦然。 其次,虽然model可能包含view可能需要的所有数据,但您可能希望以model不支持的方式抽象该数据。 例如,假设您的模型包含date属性。 在模型中,它可以单独作为DateTime对象存在,但是您的视图可能希望以完全不同的方式呈现它。 如果没有viewmodel您将不得不复制model的属性以支持视图,或者修改可能严重混淆“模型”的属性。 您还可以使用viewmodel模型来聚合模型中存在于单独的类/库中的部分,以简化view的处理流程。 您不太可能希望以用户希望或希望将数据呈现给他们的相同方式来处理代码中的数据。 最重要的是,您还支持view和viewmodel之间的自动双向数据绑定。 是什么激发了MVC MVC的核心是我所说的“独立演示”。 分离演示的背后思想是在建模我们对现实世界的感知的领域对象和作为屏幕上看到的GUI元素的演示对象之间进行清晰的划分。 域对象应该完全独立并且可以在不引用演示文稿的情况下工作,它们还应该能够支持多个演示文稿,并且可能同时支持。 Q2。 为什么我们要在主线程上执行UI操作? 回答 :由于某些原因,您必须在主线程上更新UI。 第一个是在Cocoa Touch中,在主线程上设置了UIApplication。 这是启动应用程序时实例化的应用程序的第一部分。 屏幕上的所有视图(例如您正在使用的标签)都是该UIApplication实例的后代。 因此,当您点击按钮或使用按钮时,这些必须在主线程上进行更新,因为它们是主线程的一部分。 同样,任何来自按钮或标签的事件(例如敲击或捏)都将是主线程的一部分,应在此进行处理。 另一个原因是图形渲染:iPhone的图形管道最终是同步的。 假设您正在使用UILabel,即屏幕上的一些文本。 您等待异步请求返回,也许是包含iPhone用户名的用户数据。 数据输入后,您将使用用户名更新标签。 UIKit是UILabel所属的框架,然后在屏幕上呈现文本。 它将光栅化字体(因为字体是矢量),然后将文本转换为像素。 当该文本是混合层的一部分时,例如在剪切或应用透明度时,图形渲染器将计算应显示标签的哪个像素。 然后将这些像素与屏幕的其余部分放在一起,每秒最多60次。 绘制到iPhone屏幕上(点亮LED显示屏上的像素)是需要立即进行的过程,屏幕上的所有像素都必须同时出现。 从定义上讲,异步编程不是同步的,而是并行的,您不确定异步操作何时完成。 如果允许异步绘制到iPhone显示屏,则可能会出现大量的闪烁和丢失的零件,因为在渲染整个屏幕时尚未准备好对该零件的处理。 最终,在主线程上更新UI更加简单。 它可以为您节省大量决策,需要解决的问题和错误。 当然,只要UI的更新是同步的,就可以在异步线程上创建UI的一部分。 一些例子: 将滤镜或图形效果应用于视图,例如圆角或使用CIFilter。 这些过程非常密集,您需要对其进行缓存,并在将它们绘制到屏幕之前在异步线程上分派它们。 创建动态图形,例如动画。 您首先要处理它们,然后播放处理后的动画。 绘制图形和生成的图像也是如此。 下载网络资源(如用户数据),然后同步更新UI。 […]

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

iOS面试题2018 Q1。 您有一个iOS应用程序处于前台,用户在iPhone上按“主页”按钮,将调用UIViewController的哪个API,并按正确的顺序进行描述? 解决方案: ViewWillDisappear-> ViewDidDisappear 加载视图控制器的方法有以下三种: 要从情节instantiateViewController(withIdentifier:)加载视图控制器,请调用相应的UIStoryboard对象的UIStoryboard instantiateViewController(withIdentifier:)方法。 要使用nib文件初始化视图控制器对象,请以编程方式创建视图控制器类,然后使用init(nibName:bundle:)方法对其进行init(nibName:bundle:) 。 使用loadView()方法为视图控制器指定视图。 在该方法中,以编程方式创建视图层次结构,并将该层次结构的根视图分配给视图控制器的view属性。 Q2。 什么是固有内容大小? 解决方案 :具有基于内容大小的自然大小的视图称为其固有内容大小。 例如,按钮的固有内容大小是其标题的大小加上很小的空白。 Q3。 什么是内容拥抱,抗压缩性,您能否说出视图的默认值? 解决方案 :自动版式使用每个尺寸的一对约束来表示视图的固有内容大小。 内容拥抱将视图向内拉,使其紧贴内容周围。 压缩阻力将视图向外推,因此它不会剪切内容。 这些约束中的每一个都有其自己的优先级。 默认情况下,视图使用250优先级表示内容,并使用750优先级表示抗压缩性。 因此,拉伸视图比收缩视图更容易。 Q4。 考虑以下情形:考虑应用程序中的图像详细信息页面,该页面相对于Superview定位。 但是在iPhone X上,即使此特定视图使用“自动布局”,页面控件在屏幕底部的位置也太低了。 它正在运行到“主页”指示器中。 您将如何解决这个问题? 解决方案 :这里的问题是页面控件的底部约束是相对于超级视图的,超级视图是全屏显示,并且位于“主页”指示器后面。 除了限制超级视图,我们还应该将页面控件限制在底部的“安全区域”布局指南中。 如果我们将其更改为连接到“安全区域”,而不是“超级视图”,那么在iPhone X上,页面指示器将自动向上移到“主页”指示器上方。 Q5。 什么是View自动布局生命周期? 解决方案:在自动布局周期中初始化UIView之后,需要执行3个步骤。 更新通过 (根据其约束计算视框) 系统从上到下 (即从超级 视图到子视图 updateConstraints()遍历视图层次结构,并为每个视图调用updateConstraints() 。 布局阶段 (每个视图的框架都使用在“ 更新”阶段中计算出的矩形进行更新 。) 它是自下而上发生的 ,即系统将视图从子 视图遍历到超级视图,并为每个视图调用layoutSubviews […]

访问控制说明符(快速)—简而言之

开放,公开,内部,私有,文件私有 在本文中,我将用螺母壳介绍所有五个访问控制说明符,以便您可以长时间记住它。 您必须了解一件事: module 。 想象一个模块是一捆代码。 您的单个Xcode项目/框架/捆绑包被视为一个模块。 例如:CoreData,UIKit,CustomFramework是模块。 打开: 可以从外部模块(UICollectionView或UITableView)创建子类,添加更多功能,访问其自身的功能。 上市 : 没有子类,可以使用Delegate覆盖模块外部的功能(UICollectionViewDelegate或UITableViewDelegate)-只有子类只能在定义它们的模块内覆盖它。 公共访问级别使实体可以在定义模块之外使用 内部: 模块中对with的访问限制,例如:即使我们导入CoreData,iOS开发人员也无法访问CoreData工程师创建的内部函数。 FilePrivate: 从其类型之外但在同一文件中进行访问。 如果将某文件标记为filePrivate,则可以在声明该文件的同一文件中的任何位置读取该文件,甚至可以在该类型之外读取。 私人的 : 从外部访问,但只能在其类型(扩展名)中进行访问,只能在声明它的类型内部或在同一文件中创建的对该类型的扩展内部读取私有属性。 重要 公用类型默认为具有内部成员,而不是公用成员。 如果要让类型成员公开,则必须明确地将其标记为公共成员。 此要求确保您选择发布类型的面向公众的API,并避免错误地将类型的内部工作方式呈现为公共API。 参考文献: https://docs.swift.org/swift-book/LanguageGuide/AccessControl.html

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

2018年8月iOS最新面试题 在本文中,我将介绍在最近的采访中(2018年8月)向iOS工程师询问的一些问题。 那些正在准备的人一定会对他们有所帮助。 Q1。 swift和目标C有什么区别? Q2。 什么是手动保留周期? Q3。 Swift中的内存管理如何工作? 我们首先看一下Swift中的内存管理基础知识。 ARC(自动引用计数)为您完成了大多数内存管理工作,这是一个好消息。 原理很简单:默认情况下,每个指向类实例的引用都是所谓的强引用。 只要有至少一个强引用指向一个实例,该实例就不会被释放。 如果没有足够的参考指向该实例,则该实例将被释放。 让我们看下面的例子: class TestClass {init(){print(“ init”)} deinit {print(“ deinit”)}} var testClass:TestClass? = TestClass()testClass =无 创建实例后,情况如下所示: testClass对TestClass的实例有很强的引用。 如果我们现在将此引用设置为nil,则强引用将消失,并且由于没有强引用,因此TestClass的实例将被释放: 顺便说一句,如果您看一下控制台,您会发现一切工作正常,因为只有在释放实例时,系统才会调用deinit方法: 如果TestClass的实例未释放,则不会出现“ deinit”消息。 正如我们将在后面讨论的那样,在deinit内放置一条日志消息是观察对象释放的一种很好的方法。 Q4。 拥有所有权的方法有哪些(保留数增加1)? alloc / init —创建一个对象并声明其所有权 保留—用于声明该对象的所有权 复制—复制对象并声明其所有权 Q5。 什么方法用于声明所有权(将保留计数减少1)? release —声明对象的所有权。 自动释放—声明对象的所有权。 Q6。 什么是面向协议的编程及其好处? Swift的设计核心是两个非常强大的想法:面向协议的编程和一流的值语义。 这些概念中的每一个都有益于可预测性,性能和生产率,但是它们一起可以改变我们对编程的思考方式。 了解如何应用这些想法来改进编写的代码。 快速进行面向协议的编程 Q7。 如何检查协议的可选方法在继承的类中实现? […]

iOS 2018系列:破解iOS采访或成为iOS专家(9)

快速枚举,免费电话桥接和必须了解iOS基础知识 这次,我将在下一篇文章中介绍一些有关iOS的基本知识,并概括介绍LRU Cache。 快速枚举是枚举集合内容的首选方法,因为它具有以下优点: 枚举比直接使用NSEnumerator更有效。 语法简洁。 如果在枚举时修改集合,则枚举器将引发异常。 您可以同时执行多个枚举。 Core Foundation框架和Foundation框架中有许多数据类型可以互换使用。 此功能称为免费桥接 ,意味着您可以将相同的数据类型用作Core Foundation函数调用的参数,或者用作Objective-C消息的接收者。 例如: NSArray和CFArrayRef可以在Core Foundation和Foundation之间互换使用 核心基础类型 CFArrayRef 基础类 NSArray 解释(__bridge),(__ bridge_retained)和(__bridge_transfer)强制转换的正确用法。 (__bridge T) op将操作数转换为目标类型T。如果T是可保留对象指针类型,则op必须具有不可保留指针类型。 如果T是不可保留的指针类型,则op必须具有可保留的对象指针类型。 否则,演员表的格式不正确。 没有所有权转移,并且ARC不插入保留操作。 (__bridge_retained T) op将必须具有可保留对象指针类型的操作数转换为目标类型,该目标类型必须是不可保留的指针类型。 ARC保留该值,但要对本地值进行通常的优化,并且接收方负责平衡+1。 (__bridge_transfer T) op将必须具有不可保留指针类型的操作数转换为目标类型,该目标类型必须是可保留对象的指针类型。 ARC将在封闭的全表达式结束时释放该值,但要对本地值进行通常的优化。 为什么应用程序在低设备内存上崩溃? iOS设备通过分页使用虚拟内存。 由于它是移动设备,没有可用的可扩展内存或相当大的内存(如硬盘驱动器),因此页面的可用性受到各种因素的限制,例如打开的应用程序数量,不同应用程序的分配等。 ,即使是处于休眠状态的某些板载应用程序(例如野生动物园,i-tunes,消息传递等)也将始终使用某些页面。因此,实质上,随着应用程序数量的增加,您的应用程序可以使用的页面数进一步减少。 因此,当您的应用程序分配的速率超过其他应用程序释放页面的速率时,您的应用程序将崩溃。 操作系统仅从内存中释放只读数据,而不会释放可写数据。当可写数据超过某个阈值时,操作系统会要求应用程序释放内存。 无法释放内存会导致崩溃。 解释UIView和CALayer之间的关系 尽管许多开发人员都认为,但CALayer是iOS中基本的绘图单元。 我们之所以这样认为UIView是因为它是CALayer之上的一薄层,对于大多数UI挑战,使用某种形式的UIView都可以正常工作。 您无需触摸CALayer,就可以创建自定义视图,将其引入其中,处理用户交互甚至为它们设置动画。 每个带有CALayer的UIView都被称为“底层”或“底层”。您在UIView上调用的许多方法都只是委派给该层。 更改视图的框架时,只是在更改图层的框架。 如果您更改Alpha,它将更改图层的Alpha……等等,包括背景色,变换等。 尽管可以维护UIViews的层次结构,每个UIViews代表彼此的父级和子级,但是您可以使用CALayer进行相同的操作。 我应该使用子视图还是子图层? 这不是一个简单的问题,但是有一个经验法则使决定变得容易得多。 视图和图层之间的主要区别在于,视图可以接受用户输入,而图层则不能。 层只是图形表示。 […]

IOS热门访谈问答(2019年1月)第1部分

如有其他疑问,请查看以前的文章-2018/2019年度IOS面试常见问题解答 Q1。 写下与reduce() api?类似的自定义方法reduce() api? Ans: sum = array.reduce(0, +) //reduce() here is an ((Int, ((Int, Int) -> Bool)) -> Int) //and the + operator is func +(lhs: Int, rhs: Int) -> Bool, //… or ((Int, Int) -> Bool), so there’s no need to define reduce’s closure. Q2。 如何使属性的getter可用,但只能从代码中快速设置属性? 回答:下面的示例显示TrackedString结构的版本,其中该结构的定义是具有显式公共访问级别。 因此,结构的成员(包括numberOfEdits属性)默认具有内部访问级别。 通过结合使用public和private(set)访问级别修饰符,可以使结构的numberOfEdits属性getter公开,而其属性setter私有。 Q3。 在Swift 4.2中,引入了用户定义的“动态成员查找”类型,其目的是什么? […]