当前位置:首页 > 内存 > 正文

ios内存管理面试题

  • 内存
  • 2024-06-09 08:35:38
  • 6861

一、iOS面试题:runloop的mode作用是什么?

CoreFoundation中RunLoop有5个类,分别对应不同的概念:

上面的source/timer/monitor统称为modeitem,一个item可以同时添加到多个mode中。但是当你重复将一个项目添加到同一模式时,它将没有效果。如果mode中没有item,RunLoop会直接退出,不进入循环。

这些概念之间的整体关系如下:

线程在运行的过程中,在不同的情况下需要处理不同的事件,并告诉我们要处理什么事件当前要做的事情有哪些必须响应的事件?RunLoop有多种模式,每种模式包含多个源/定时器/监视器。每次调用RunLoop的主函数时,只能选择一种模式,这种模式称为CurrentMode。如果需要切换模式,只需退出循环并重新选择要进入的模式即可。这样做主要是为了将不同的源/定时器/观察者组合分开,使它们不会互相影响。

CFRunLoopMode和CFRunLoop的结构大致如下:

有一个叫做CommonModes的概念:一个模式可以将自己标记为一个公共主题(通过将其模式名称添加到公共主题中)CommonModes的模式)RunLoop)。每当RunLoop内容发生变化时,RunLoop都会使用common标志自动将_commonModeItems中的source/observer/timer同步到所有模式。

应用场景示例:主线程的RunLoop中有两种预定模式:kCFRunLoopDefaultMode和UITrackingRunLoopMode。两种模式都被标记为共同特征。DefaultMode是应用程序的正常状态,TrackingRunLoopMode是跟踪ScrollView滑动时的状态。当你创建一个定时器并将其添加到DefaultMode时,定时器会得到重复的回调,但是当你滚动TableView时,RunLoop会将模式切换到TrackingRunLoopMode,此时定时器不会再次被调用,也不会产生影响。滑动操作,因为这个定时器作为一个元素Modem还没有被添加到commonModeItems中,所以它不会与另一个CommonMode同步。

有时你需要一个可以在两种模式下获取回调的定时器,一种方法是分别将此定时器添加到两种模式中。另一种方法是在顶层RunLoop中的commonModeItems中添加一个Timer。commonModeItems由RunLoop自动更新为所有具有公共属性的模式。

CFRunLoop只有以下两个对外暴露的管理模式接口:

该模式只有以下两个接口,用于管理暴露的模式元素:

你只能使用modename来运行内部模式,当你传入一个新的模式称但RunLoop内部没有匹配的模式时,RunLoop会自动为你生成一个对应的CFRunLoopModeRef。对于RunLoop来说,只能添加其内部模式,不能删除。

Apple一般提供两种模式。你可以使用这两种模式来开启它们对应的模式:

同时Apple还提供了一个开启Common标签的字符串:kCFRunLoopCommonModes(NSRunLoopCommonModes),你可以使用这个字符串来开启CommonItems,或将模式标记为“普通”。使用时请小心区分该字符串与其他调制解调器名称。

更多:iOS面试题合集