迭代错误数组时出现 Swift 内存泄漏

2024-02-23

我对 Swift 比较陌生,所以我希望我没有问一个愚蠢的问题。

我有一些实例化类型数组的代码Error,稍后将被迭代并打印到控制台。当使用“Leaks”工具通过 Instruments 运行此代码时,它显示了泄漏_SwiftNativeNSError。如果我更改数组类型[Error] to [Any],泄漏消失了,即使它实际上仍然持有一个符合Error。我尝试过的任何其他数据类型或协议都无法重现该泄漏。

这是一些示例代码:

class myLeak {
  lazy var errors = [Error]()
    enum err: Error {
        case myFirstError
    }

    func doSomething() {

        errors.append(err.myFirstError)
        for error in errors {
            print(String(describing: error))
        }
    }
}
// call with let myleak = myLeak(); myleak.doSomething()

调用 doSomething() 函数会立即产生泄漏。交换[Error]() to [Any]()解决了泄漏,但在不了解根本问题的情况下,我对此作为解决方案并不满意。问题也通过改变解决了[Error]()到我的枚举实现Error协议:[err]()。我还尝试创建自己的自定义协议只是为了证明这是否是专门由Error,并且我只能在使用时重现问题Error;我自己的自定义协议没有表现出这种行为。

最初,我的代码使用了forEach循环来迭代数组,但然后我尝试重写它以使用标准for循环以防闭包forEach导致了这个问题,但这不起作用。

我怀疑这可能是一个 Swift 错误(在这种情况下,我会为其打开一个问题),但也有可能我错过了一个关键的理解。如果我所做的事情是不好的做法,我想了解为什么。


Update:

在与 Apple 工程师 Joe Groff 交谈后,您可能遇到了以下错误:https://bugs.swift.org/browse/SR-6536 https://bugs.swift.org/browse/SR-6536

原答案

我玩了一下你的代码,我认为问题是由于Error类型。 事实上,如果你使用 Josh 的代码,你会发现不同的行为Error or MyError作为数组的类型。

我想问题是从deinit呼叫未转接至CustomObject since Error只是一个协议,它不知道底层类。尽管,MyError是。我们可以等待其他人对这种行为做出澄清。

为了简单起见,我在这里使用 Playground。请注意,我什至没有尝试打印错误值。

import UIKit

class ViewController: UIViewController {
    var errors: [Error] = [] // change to MyError to see it working

    enum MyError: Error {
        case test (CustomObject)
    }

    class CustomObject {
        deinit {
            print("deiniting")
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        let testerror = MyError.test(CustomObject())
        errors.append(testerror)
        errors.removeAll()
    }    
}

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

迭代错误数组时出现 Swift 内存泄漏 的相关文章

随机推荐

  • 仅当不在生产环境中时才导入 NodeJS

    基本上 我使用 morgan 来查看开发中的日志 我有它在下面 save dev 但在我的app js I use const morgan require morgan 它在我的本地计算机上运行良好 但我只使用摩根 具体取决于NODE E
  • 将 Rails 应用程序从 Windows 连接到 SQL Server 2005

    I sadly 必须部署一个railsWindows XP 上的应用程序必须连接到微软SQL服务器2005 在网上冲浪有很多关于从 Linux 连接到 SQL Server 的内容 但找不到如何从 Windows 进行连接 基本上我遵循了以
  • 下标超出范围,VBA

    您好 我收到错误 因为下标超出范围 但我无法确定原因 错误位于标有 的行中 Function RemoveDups aryValues As Variant Dim dict As Object Set dict CreateObject
  • Grails i18n UrlMappings

    我正在处理以下问题 在我们的项目中 我们为同一网站启动了不同的国际化域名 问题在于不同语言的 UrlMappings 例如 英文 姓名联系人 contact controller static action index id contact
  • 不使用 update 语句更新表

    谁能告诉我如何在不使用更新语句的情况下更新表的某些记录 可以使用 select 语句 我不认为你可以update桌子没有update陈述
  • 我应该忽略在 Git 中提交的 launchSettings.json 文件吗?

    我找到了这个相对知名的 GitHub 存储库 他们在那里考虑了launchSettings json文件 Visual Studio 2017 用于 Net Core 项目 是ignored https github com github
  • Rails 中的竞争条件 first_or_create

    我正在尝试强制表字段之一中值的唯一性 改变桌子不是一个选择 我需要使用 ActiveRecord 有条件地将一行插入表中 但我担心同步 Does first or createRails ActiveRecord 中的防止竞争条件 这是源代
  • ocaml 漂亮的打印机(代码格式化程序)

    我正在寻找适用于 ocaml 的代码格式化程序或漂亮的打印机 类似 gofmt 的 go 编程语言 它最好应该保留评论 我正在纠正提交的内容 一些代码的格式使其非常难以阅读 如果你不关心评论 你可以使用camlp4 camlp4
  • 如何使用 FirebaseRecyclerAdapter

    Override public void onStart super onStart FirebaseRecyclerAdapter
  • iPhone - UIImagePickerControllerDelegate 继承

    我添加了一个UIImagePickerController to a UIViewController 我还分配了UIImagePickerControllerDelegate对此UIViewController 当我执行以下行时 myPi
  • Discord.js 计时器,定期更新倒计时

    我目前正在制作一个计时器命令 用户可以输入类似 prefix timer 10m 的内容 机器人将启动一个 10 分钟的计时器 并且每 20 30 秒它会自我更新一次 但我不确定我该怎么做它 提前致谢 一种可能的方法是使用setInterv
  • Doctrine DQL 从关系表中删除

    使用 Doctrine 2 和 Symfony 2 0 我有两个 Doctrine 实体 假设 EntityA 和 EntityB 他们之间有多对多关系 这样数据库中就创建了一个EntityA EntityB表 使用 DQL 或 Query
  • Clojure core.match 无法在类上匹配

    当评估这个超级简单的 core match 表达式时 我得到 match class 3 14 Integer Integer Double Doubler gt Integer 这怎么可能是正确的 我是否遗漏了有关 core match
  • 如何通过python执行shell脚本

    我有一个脚本 abc sh 其中包含带有标志的命令列表 例子 abc sh echo FLAG name cp FLAG file1 FLAG file2 echo file copied 我想通过python代码执行这个脚本 说 xyz
  • RSpec - 测试强参数 ActionController::ParameterMissing

    如何测试某一行为是否会引发ActionController ParameterMissing例外 例如 it raises an exception do post create expect response to raise Actio
  • 如何在 Ruby 中读取文件的行

    我试图使用以下代码从文件中读取行 但是当读一个file http dl dropbox com u 559353 rss20 xml txt 内容全部在一行 line num 0 File open xxx txt each do line
  • Swift 将 AnyObject 转换为 Block

    因此 我使用 Salesforce SDK 并为整个 SDK 构建了桥接标头 它们提供了一个块语法 但尚未转换成最有用的代码 例如 func sendRESTRequest request SFRestRequest failBlock S
  • 在模板内对 $data 进行双向绑定

    我正在尝试设置通用的 Knockout 模板 可以根据数据类型在编辑和只读模式之间切换 如果您曾经使用过 ASP NET 的动态数据 它就像它们的字段模板 例如 这是这样使用的
  • 可以单独编译任何 .c 文件(即没有 main ?)

    我目前有一个 类似库 的 c 文件 如下所示 我有两个问题 如果我想看看它本身是否编译得很好 我该怎么做 如果我尝试 gcc 它 它总是会给出 no main 错误 这是有道理的 但会引发一个问题 知道给定的 c 文件是否可以在 隔离 中编
  • 迭代错误数组时出现 Swift 内存泄漏

    我对 Swift 比较陌生 所以我希望我没有问一个愚蠢的问题 我有一些实例化类型数组的代码Error 稍后将被迭代并打印到控制台 当使用 Leaks 工具通过 Instruments 运行此代码时 它显示了泄漏 SwiftNativeNSE