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进行相同的操作。

我应该使用子视图还是子图层?

这不是一个简单的问题,但是有一个经验法则使决定变得容易得多。 视图和图层之间的主要区别在于,视图可以接受用户输入,而图层则不能。 层只是图形表示。 视图可以处理用户的点击,拖动,捏等操作。对我而言,这就是您需要知道的全部内容。

conformsToProtocol与responsToSelector

conformsToProtocol方法让您检查是您的对象实现特定协议。 它不会告诉您它包含此协议定义的方法(某些方法可以是可选的)。

respondsToSelector检查对象是否具有特定方法(该方法无需在任何协议中定义),可以在类中定义该方法。

响应者链和第一响应者

ResponderChain是对象的层次结构,它们有机会响应收到的事件。

ResponderChain中的第一个对象称为FirstResponder。

边框和界限之间有什么区别?

UIView的边界是矩形,表示为相对于其自身坐标系(0,0)的位置(x,y)和尺寸(宽度,高度

UIView的框架是矩形,表示为相对于其中包含的超级视图的位置(x,y)和大小(宽度,高度)。

浅复制与深复制。

对象的副本可以浅也可以深。 浅复制和深复制方法都直接复制标量属性,但是在处理指针引用(特别是对对象的引用)(例如,NSString * str)的方式上有所不同。 深层副本将复制所引用的对象,而浅层副本仅复制对那些对象的引用。 因此,如果对象A浅复制到对象B,则对象B引用与对象A引用的相同的实例变量(或属性)。 深度复制对象优于浅层复制,特别是对于有价对象。

浅是“按引用”,深是“按值”

__unsafe_unretained就像__weak一样,但是在释放对象时指针未设置为nil。 相反,指针悬空了。

希望您喜欢这篇文章。 请❤️将这个帖子推荐给其他人😊。 让我知道您的反馈。 🙂