gpt4 book ai didi

从自动释放池中快速退出循环?

转载 作者:搜寻专家 更新时间:2023-11-01 05:54:37 25 4
gpt4 key购买 nike

假设我在循环中有以下内容:

for i in 0...10 {
autoreleasepool {
// do some crazy memory thing
}
}

我将如何从 autoreleasepool block 中跳出 for 循环?

最佳答案

我推断这个问题的目的是能够发布一个答案,展示 autoreleasepool 实际上是一个通用方法,返回其闭包返回的任何值。有人建议可以这样做:

for i in 0...10 {
if (
!autoreleasepool {
// do stuff
// return false for break, true for continue.
return true
}
) {
break
}
}

虽然当我们第一次发现这些同步闭包方法中的许多实际上是返回闭包所做的任何事情的泛型时,这很有启发性,但我认为这不是应用它的一个特别好的例子。如果您需要代码中的注释来解释返回值的含义,那是更深层次问题的代码味道。我想rmaddy’s approach (+1) 更清晰,更容易推理。 autoreleasepool 有很好的用途,可以返回与闭包相同的 Result,但这不是它,恕我直言。


让我们考虑一个更有吸引力的 autoreleasepool 返回类型的使用。假设您有一些执行以下操作的例程(我删除了 GCD 调用以将我们的注意力集中在 autoreleasepool 上):

func generateAllImages() {
for index in 0 ..< imageCount {
let image = generateImage(for: index)
updateUserInterface(for: index, with: image)
}
}

假设在分析应用程序的过程中,我们发现隐藏在 generateImage 中的东西创建了一个自动释放对象,这使得我们应用程序的峰值内存使用率真正飙升。显然,您可以执行以下操作来降低应用程序的高水位标记,在每次迭代时清空自动释放池:

func generateAllImages() {
for index in 0 ..< imageCount {
autoreleasepool {
let image = generateImage(for: index)
updateUserInterface(for: index, with: image)
}
}
}

但是如果您已经确认您的自动释放对象被限制在 generateImage 例程的范围内,您可以稍微整理一下:

func generateAllImages() {
for index in 0 ..< imageCount {
let image = autoreleasepool { generateImage(for: index) }
updateUserInterface(for: index, with: image)
}
}

这不仅更简洁,而且清楚地说明了自动释放对象的创建位置。这种模式让我印象深刻,因为它非常自然且令人信服地使用了 autoreleasepool 行为来返回其闭包返回的对象。

关于从自动释放池中快速退出循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56295396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com