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-解释获取请求步骤

我们将创建任务。 我们将从服务器接收回数据。 我们将根据是否存在错误以及数据是什么来处理它。

39-在视图中解释坐标系

UIkit定义了一个默认坐标系,其原点位于左上角,轴向右延伸,并从原点向下延伸。 视图在此坐标系内进行布局以定位和调整其大小。

除了此默认坐标系(我们将其称为屏幕坐标系)之外,应用程序的窗口和视图还定义了自己的本地坐标系。

例如,单个视图,视图对象使用框架和边界跟踪其大小和位置。 框架是矩形,用于指定视图在其SuperView坐标系内的大小和位置。

另一方面,边界矩形在其自己的局部坐标系内指定视图的大小。 请记住第1部分。

40-解释编码,解码和序列化,反序列化

序列化是将数据转换为单个字符串或json以便可以轻松存储或传输的过程。 序列化 ,也称为编码 。 将单个字符串转换为数据的反向过程称为解码反序列化 。 我们迅速使用一种类型可以遵循的Codable协议,声明它可以被编码和解码。 它基本上是可Encodable和可Decodable协议的别名。

41-使用IBAction和IBOutlet的目的是什么?

IBActionIBOutlet是定义为表示可以在Interface Builder中引用的变量和方法的宏。

IBAction解析为voidIBOutlet解析为void ,但它们向Xcode和Interface构建器表示这些变量和方法可在Interface构建器中用于将UI元素链接到您的代码。

42-解释 AlamoFire的 好处

  • AlamoFire创建一条路线。 这意味着我们可以创建请求并通过一个静态函数将其执行到服务器。
  • AlamoFire为返回的请求提供方法链接,这使得添加标头和处理响应变得容易。
  • AlamoFire有多个以二进制形式,文本,解析JSON返回的响应处理程序,我们甚至可以针对给定的请求使用多个响应处理程序。
  • AlamoFire的方法链接允许响应验证。 我们可以调用验证来检查HTTP响应的状态代码,内容类型或您可能需要对我们的应用执行的任何自定义验证。
  • AlamoFire为我们提供了使用以下两个协议的协议:URLConvertible和URLRequestConvertible。 创建请求时可以传递这些协议。
  • AlamoFire提供了可以传递的扩展来创建请求。

43-在iOS中解释信号量

当我们在iOS上执行线程操作时,它可以工作。 在将数据下载到设备时,该应用程序在防止数据干扰不同进程方面非常有效。 或者,我们可以通过检查等待时间来使过程超时。

作为一种结构,根据情况使一个以上的工作过程保持等待,而另一个过程则参与诸如完成后进入电路之类的过程。

44-什么是LLDB?

它是LLVM编译器基础结构的调试器。 这是主页,这是一篇不错的文章: 在调试器中跳舞— LLDB的Waltz

45-解释元组

元组是Swift中的复合类型,这意味着我们可以像结构一样保存多个值。 元组保存非常有价值的数据类型,但是我们创建了数据结构(如字典)。

46-解释Swift中泛型和AnyObject之间的区别

泛型是类型安全的,这意味着如果您将字符串作为泛型传递并尝试将其用作整数,则编译器将抱怨并且您将无法编译您的代码。 由于Swift使用的是Static类型 ,并且能够给您带来编译器错误。

如果使用AnyObject,则编译器不知道该对象是否可以视为String或Integer。 它可以让您随心所欲。

47-解释依赖倒置原理

依赖关系反转原理通过显式为类提供依赖关系,而不是让它们自己创建依赖关系,从而使类彼此分离。

48-什么是烟雾测试?

冒烟测试,也称为“构建验证测试”,是一种软件测试,包括一组非详尽的测试,旨在确保最重要的功能正常工作。

据说,“烟雾测试”一词来自类似类型的硬件测试中的软件测试,其中,如果设备在首次打开时没有着火(或冒烟),则该设备通过测试。

49-解释UIEdgeInsetsMake如何工作?

根据文档:我们可以使用此方法向图像添加大写插入或更改图像的现有大写插入。 在这两种情况下,您都将获得一个新图像并且原始图像保持不变。 我们在UIEdgeInsetsMake函数的值中使用我们想要使其UIEdgeInsetsMake拉伸的像素数量。 目标是保留图像的原始圆角。 使用UIEdgeInsets,我们可以指定图像的顶部,左侧,底部和右侧的像素数。

语法: UIEdgeInsets(top: 0, left: 0, bottom: 10, right: 0)

50- id是什么意思?

id是指向任何类型的指针,它始终指向一个Objective-C对象。 AnyObject协议类似,它有助于弥补Swift和Objective-C之间的鸿沟。

如果您想在社交媒体上关注我,请访问以下链接:github,twitter,linkedin