Swift:重复调用通过身份函数传递的闭包导致EXC_BAD_ACCESS代码= 2

Swift:重复调用通过身份函数传递的闭包导致EXC_BAD_ACCESS代码= 2,第1张

概述更新: 这是一个更简单的再现,不使用数组(h / t到Tim): func identity<T>(_ v: T) -> T { return v}var closure = { return}while true { closure() closure = identity(closure)} 运行此代码会导致堆栈溢出.我正在向Swift提交一个错误 更新:

这是一个更简单的再现,不使用数组(h / t到Tim):

func IDentity<T>(_ v: T) -> T {    return v}var closure = {    return}while true {    closure()    closure = IDentity(closure)}

运行此代码会导致堆栈溢出.我正在向Swift提交一个错误.

原版的:

原标题:Swift:闭包数组导致EXC_BAD_ACCESS代码= 2

我试图理解为什么这段代码产生EXC_BAD_ACCESS代码= 2.这是代码:

var closures: [() -> ()] = []closures.append({    return})while true {    var newClosures: [() -> ()] = []    for closure in closures {        closure()        newClosures.append(closure)    }    closures = newClosures}

我试图将问题提炼到尽可能少的行,这就是为什么代码看起来有点奇怪和毫无意义. (它唯一的“观点”是用尽可能少的线来证明我所遇到的问题.)

如果您在XCode中将此代码作为macOS控制台应用程序运行,您将看到正在分配内存而不会被释放.在Instruments中我可以看到内存是在newClosures.append(closure)中分配的,这是有道理的.我不明白为什么为newClosures分配闭包不会释放旧版本的newClosures.相反,分配似乎无限增长,直到我EXC_BAD_ACCESS代码= 2.

值得注意的是,它甚至没有分配太多内存.在我的测试中,应用程序在分配大约17MB后崩溃(它从大约5MB开始,并在大约60s内上升到17MB).所以我认为它与保留的对象数量有关,而不是它们的纯粹大小.

如果我用一个数组将闭包数组替换为其他引用类型,例如

class Foo { }var foos: [Foo] = []foos.append(Foo())while true {    var newFoos: [Foo] = []    for foo in foos {        newFoos.append(foo)    }    foos = newFoos}

它按预期工作.我认为必须在闭包每次循环中捕获越来越多的东西时会发生什么?但我不明白这是怎么回事.

我可以重构代码来解决这个问题,但是在这一点上我只是想了解发生了什么.

解决方法 这是Swift中的一个错误.在这里跟踪问题,@L_502_1@. 总结

以上是内存溢出为你收集整理的Swift:重复调用通过身份函数传递的闭包导致EXC_BAD_ACCESS代码= 2全部内容,希望文章能够帮你解决Swift:重复调用通过身份函数传递的闭包导致EXC_BAD_ACCESS代码= 2所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1003224.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存