Swift Calendar.当前内存泄漏?

2023-12-23

我在应用程序中遇到了内存问题,我已经能够将其分解为 NSCalendar。

一个简单的视图控制器如下所示:

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        while Calendar.current.component(.year, from: Date()) > 0
        {
            // why does the memory keep increasing?
        }
    }
}

似乎导致内存泄漏。

这个例子显然会阻塞 UI 线程,但它不应该导致内存不断增加,或者至少在循环完成后被释放。至少从我的理解来看不应该。我在这里误解了一些基本的东西吗?或者这是一个错误?

我该如何解决这个问题?

Update

引用评论中的内容:

仅供参考 - 您的问题与 NSCalendar 无关。你的问题是你的 while 循环不允许清理内存

所有这些 Date 实例也占用内存

好吧,但如果我运行一个仅进行日期比较的循环,我不会遇到同样的问题。这是因为优化器介入了吗?

while Date() > Date(timeIntervalSince1970: 200)
{
    // no increase of memory here
}

正如其他人指出的那样,问题在于Calendar.current.component(_:from:)是在幕后引入一个自动释放对象,该对象在自动释放池耗尽之前不会被释放。

回到引用计数 Objective-C 代码的早期,返回一个新分配的对象(当调用者使用完该对象后将自动释放该对象)的常见方法是返回一个“自动释放”对象。这是一个只有在返回到运行循环时才会被释放的对象,这会耗尽自动释放池 https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html#//apple_ref/doc/uid/20000047-CJBFBEDI。您可以通过添加自己的手动自动释放池来控制重复创建自动释放对象的大型循环的高水位线。

Swift 本身并不创建自动释放对象,因此这个问题有点像 Objective-C 的不合时宜,我们在自己的 Swift 代码中通常不会遇到这种情况。但是每当编写循环和调用可能在幕后使用自动释放对象的 Cocoa API 的代码时(例如在本例中),我们必须对此保持敏感。

在深入研究解决方案之前,我将把您的示例调整为保证最终退出的内容。例如,让我们编写一个循环运行的例程,直到minute与当前时间变化相关(例如当前分钟结束和下一分钟开始时)。我们假设previousValue包含当前的minute value.

诀窍是我们需要把autoreleasepool https://developer.apple.com/documentation/objectivec/2299644-autoreleasepool inside循环。在下面的示例中,我们利用了以下事实:autoreleasepool是通用的,返回其闭包内返回的任何内容:

while autoreleasepool(invoking: { Calendar.current.component(.minute, from: Date()) }) == previousValue {
    // do something
}

请注意,如果您发现该模式难以阅读(需要一段时间才能习惯闭包作为方法的参数),您可以使用repeat-until循环,完成大致相同的事情:

var minute: Int!
repeat {
    minute = autoreleasepool {
        Calendar.current.component(.minute, from: Date())
    }

    // do something
} while minute == previousValue

顺便说一句,像这样快速旋转的循环的过程效率非常低。当然,正如您所提到的,您永远不会在主线程上执行此操作(因为我们不想阻塞主线程)。但你通常不会这样做any线程,因为旋转的计算量非常大。有时你必须这样做(例如,无论如何在后台线程上进行一些复杂的计算,并且你希望它在某个特定时间停止),但十有八九,这是设计中某些更深层次问题的代码味道。通常,明智地使用计时器等可以实现所需的效果,而无需计算开销。

很难就您的情况向您提供最佳解决方案的建议,因为我们不知道您要解决的更广泛的问题。但请注意,通常不建议在线程上旋转。


You ask:

好吧,但如果我运行一个仅进行日期比较的循环,我不会遇到同样的问题。这是因为优化器介入了吗?

不,这只是因为 Date() 根本不向混合中引入任何自动释放对象,例如Calendar.current.component(_:from:)显然是这样。 (顺便说一句,Apple 一直擅长在整个代码库中缓慢删除自动释放对象,因此您可能会在未来的某个日期发现,即使这可能不需要手动自动释放池。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift Calendar.当前内存泄漏? 的相关文章

  • 使用 firebase 过滤分页列表

    我正在尝试使用 firebase 和 swift 制作一个分页过滤列表 但请随意用您最喜欢的编程语言回答 而不过滤客户端上检索到的数据 假设我有这个结构 matches match 1 name Match 1 users user 1 o
  • iOS 上 Safari 中的 shift 键

    有没有办法在javascript中判断手机键盘上是否按下了shift键 并将其与大写锁定 按两次shift键 区分开来 一些事实 首先 让我们看一下有关 iOS 键盘的一些事实 我假设您已经知道了 当您进入键盘模式时 shift键始终处于激
  • iOS 无法获取人物图像

    我有两个 tableViewController 第一个有联系人列表 另一张显示详细的人员信息 第一个tableViewController的一段代码 ABAddressBookRef addressBook ABAddressBookCr
  • iOS后台获取时间限制崩溃

    我已经设置了背景获取 使用大纲NSScreencast 第 92 集 http nsscreencast com episodes 92 background fetch BOOL application UIApplication app
  • 在 Pages 文稿中打开文本—Swift

    在我的 Swift 2 应用程序中 用户通过文本字段创建一串文本 然后将其共享给另一个应用程序 现在 我只能将文本共享为 txt 文件 这不提供选项Open In Pages当我打开系统共享对话框时 如何才能让用户可以选择将输入的文本作为
  • 如何将 .ipa 转换为 .app 文件?

    每个人 我有一些 ipa 文件 想要转换为包含 app 包的存档文件 我试图这样做 但我没有办法 有什么办法可以做到这一点吗 请帮我 将 ipa 重命名为 zip 然后提取即可
  • iOS 何时清理本地应用程序 ./tmp 目录?

    iOS什么时候清理本地应用程序 tmp目录 请注意 这不是一个骗局这个问题 https stackoverflow com questions 3593900 iphone storage in tmp directory 我问的是应用程序
  • 使用 JSONKit 解析 JSON 文件

    我正在构建一个音叉应用程序 货叉应允许最多 12 个预设节距 此外 我希望允许用户选择一个主题 每个主题都会加载一组预设 不必使用所有预设 我的配置文件看起来像这样 theme A3 comment An octave below conc
  • 在 macOS 上使用 Swift 3 从剪贴板读取

    我是 Swift 的初学者 我想弄清楚如何在 macOS Swift 3 上读取已复制到剪贴板的内容 我搜索了很多 但似乎找不到任何有效的东西 我从网上尝试过的一些事情 var pasteboardItems NSPasteboardIte
  • gestureRecognizer shouldReceiveTouch 持续存在于已释放的视图中导致崩溃

    我有一个相当简单的 UITableView 它在堆栈上推送一个新视图 新视图有一个像这样初始化的gestureRecognizer synthesize swipeGestureLeft void viewDidLoad swipeGest
  • 无法在 xcode 8 beta 6 上编译 AWS CustomIdentityProvider

    我在 iOS 应用程序中使用 Amazon Cognito 和 Facebook 登录 直到 beta 5 为止此代码从这个SO线程 https stackoverflow com questions 37597388 aws cognit
  • 依赖于不同队列上的另一个操作的 NSOperation 无法启动

    我有操作的依赖图 并且使用多个队列来组织各种操作流 例如 peopleQueue sitesQueue sessionQueue sessionQueue loginOp fetchUpdatedAccountOp peopleQueue
  • 广告标识符和标识符ForVendor返回“00000000-0000-0000-0000-000000000000”

    我已经实现了这个方法来获得advertisingIdentifier and identifierForVendor NSString advertisingIdentifier if NSClassFromString ASIdentif
  • SDK 和 iOS 部署目标。

    我使用最新的 SDK 4 1 构建项目并设置 iOS 部署目标 3 0 如果我使用4 0 sdk的某些方法 我可以在真正的iPhone 3 0上运行我的项目吗 您只能在 OS 3 设备上运行您的项目 如果有条件地编码围绕您想要使用的 OS
  • iOS绘图3D图形库[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在搜索一个可以帮助我绘制 3D 图表的库 我想要类似的东西这一页 http www math uri edu bkaskosz fla
  • Swift 中通过可选绑定进行安全(边界检查)数组查找?

    如果我在 Swift 中有一个数组 并尝试访问超出范围的索引 则会出现一个不足为奇的运行时错误 var str Apple Banana Coconut str 0 Apple str 3 EXC BAD INSTRUCTION 但是 我会
  • 设置开始日期后设置 primefaces 日历结束日期

    我正在使用 primefaces 日历来创建事件 使用 mindate 参数 我禁用了当天之前的日子 即使有结束日期 我也想这样做 禁用开始日期之前的日子 我不知道如何处理这个问题 因为支持 bean 仅在验证整个表单后才获取开始日期 我需
  • 如何在 SwiftUI 中延迟动画?

    我想为两个文本字段设置动画 第二个字段有延迟 但它不起作用 没有延迟 它们同时从位置 100 动画到 0 这是代码 State private var offset CGFloat 100 State private var offset2
  • 获取所有ios应用程序的全局列表[重复]

    这个问题在这里已经有答案了 我想对苹果应用商店进行一些全球统计 一个瓶颈是至少获取所有当前活动应用程序的 ID 这 9 位数字 有谁知道如何获取 iOS 应用商店中当前活动应用程序的所有 id 的完整列表 更好的是特定类别的所有 ID 例如
  • iOS 中是否需要 Google App Indexing SDK 才能使用 Google DeepLinking?

    我想用谷歌应用程序索引与我的网页和 iOS 应用程序 我支持通用链接 or 深层链接用谷歌术语 与苹果Search并相应地设置我的网页 From 谷歌文档 https developers google com app indexing i

随机推荐

  • 询问如何在 R 中使用 ggplot 制作世界热图?

    我想制作特定疾病的世界热图 该数据集包含国家 地区列表 纬度 经度和每个国家 地区的案例 数据可用here https drive google com file d 1 EqMEZFHlujsg40gzEo83dN1zY9d9gAJ vi
  • C 中整数表达式的大小

    令我惊讶的是 Xcode 编译 C gnu11 include
  • Magento EAV:如何硬删除属性值?

    在进入细节之前 让我们先问清楚这个问题 有没有办法hard删除属性value来自产品 By hard我的意思是 从数据库中删除该行 而不仅仅是将值设置为 null 或空 现在 详细信息 我目前在 Magento 上遇到一个问题 我商店中的许
  • 有没有一种方法可以在没有 xml 或属性文件的情况下在应用程序上下文中存储 java 变量/对象

    我想在 Spring Boot 应用程序的应用程序上下文中存储特定变量 字符串或对象 但我不想使用 xml 或属性文件来存储它 将有一个函数将数据存储在应用程序上下文中 我应该能够检索它 修改它 删除它或添加更多数据 基本上我想在初始化完成
  • 耦合常微分方程的龙格库塔

    我正在 Octave 中构建一个函数来解决N耦合常微分方程类型 dx dt F x y z t dy dt G x y z t dz dt H x y z t 使用这三种方法中的任何一种 Euler Heun 和 Runge Kutta 4
  • 如何在电子表格的 Google Apps 脚本中使用数组作为自定义函数的参数

    我正在尝试使用脚本编辑器在我的谷歌电子表格中创建自定义函数 我似乎无法允许用户为函数提供一个数组作为参数 当我像这样进行硬编码时 我的脚本可以工作 var values SpreadsheetApp getActiveSheet getRa
  • Plotly:如何自定义图例?

    我已经自定义了使用plotly绘制的数据点的颜色 数据点的颜色是根据与其关联的标签指定的 不过设置之后legend True所有三种颜色 在字典中定义 都不会显示在图中 我想 a rgb 147 112 219 the actual col
  • iOS PhoneGap 构建失败

    我是新来的PhoneGap适用于 iOS 和 Xcode 我的应用程序在 Android 手机上运行良好 但遇到了问题 我能够在 iOS 模拟器中构建并运行该应用程序 但是当我将其存档以在设备上进行测试时 出现以下错误 我到处搜索但找不到有
  • JQuery Mobile,整个网站的一个页脚片段

    I m not询问如何获得固定页脚 我有一个多页和单页的结构 我想知道如何在整个网站中仅使用一个 html 片段 我真的在寻找一种解决方案 因为我想仅在一个位置编辑页脚并在所有页面中查看修改 Thanks 编辑 我正在开发一个用 Phone
  • 为什么 VisualVM 探查器中没有显示所有方法?

    我在用VisualVM看看我的应用程序在哪里慢 但它并没有显示所有方法 可能没有显示所有延迟应用程序的方法 我有一个实时应用程序 声音处理 并且有几百微秒的时间不足 有没有可能VisualVM隐藏本身速度很快的方法 UPDATE 1 我通过
  • 使用 PK 反馈循环复制行

    鉴于以下情况 表1 Id Field1 Field2 NULL 1 2 NULL 3 4 我想将 Field1 和 Field2 的值插入到另一个表 Table2 中 Table2 有一个自增整数主键 我想从表 2 中检索新的 PK 并更新
  • 由于访问控制列表,SSRS 401.3 错误访问被拒绝

    卸载 Oracle 10 客户端 安全补丁后 不知道是什么触发了它 我在用户访问我们的 SSRS 测试服务器时遇到了问题 首先发生的事情是 SQL 服务和 SSRS 服务拒绝在 NT AUTHORITY SYSTEM 下启动 当我将其更改为
  • 无法使用 dotnet CLI 和 nuspec 文件打包 NuGet 包

    我有几个项目正在从 NET Framework 4 7 迁移到 NET Standard 2 0 结果 我正在尝试使用dotnet pack命令来创建我的 NuGet 包 同时使用我的nuspec带有令牌的文件 我有几个自定义构建脚本可以为
  • 匹配引用的 csv 中的未转义引号

    我查看了几篇具有类似标题的 Stack Overflow 帖子 但没有一个已接受的答案对我有用 我有一个 CSV 文件 其中数据的每个 单元格 均由逗号分隔并被引用 包括数字 每行以换行符结束 一些文本 单元格 中有引号 我想使用正则表达式
  • ngrx 订阅存储不会在状态更改时更新 Angular 5

    我正在构建一个应用程序 它将城市名称发送到 api 端点并返回该城市的天气 它使用两个操作 一个将更新城市 使用名称作为有效负载 第二个操作加载返回的新数组以更新状态 该效果使用 switchMap 映射 api 调用然后返回结果 用于显示
  • jsf隐式对象cc和组件之间的区别

    也许这是一个愚蠢的问题 但我用 cc 引用复合组件 例如 cc attrs randomAttr 但我也看到了 component 隐式对象 我使用它是因为我被告知要这样做 但我不太明白它的用途 谁能解释一下吗 cc指评估时正在处理的顶级复
  • 在没有内置函数的情况下按降序排列文件中的元素

    我按照冒泡排序重新编写了程序 def main try array file open input Please enter the name of the file you wish to open A file read split f
  • SASS 和 SCSS 变量名称的合法字符

    SCSS 变量名称中可以使用哪些字符 如果你查看源代码SASS 词法分析器 https github com nex3 sass blob stable lib sass script lexer rb 你会看到的 A hash of re
  • 有没有办法检测 NaN 和 -NaN?

    我想将 lua 数字保存到字符串和句柄中NaN大小写正确 检测任何 NaN 都很容易 x x 然而 我发现只有一种检测方法是NaN or NaN是使用tostring x nan 有更好的方法吗 代替tostring x nan 不方便携带
  • Swift Calendar.当前内存泄漏?

    我在应用程序中遇到了内存问题 我已经能够将其分解为 NSCalendar 一个简单的视图控制器如下所示 class ViewController UIViewController override func viewDidLoad supe