假设我有以下循环:

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

如何从autoreleasepool块中跳出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有很好的用途,但事实并非如此,imho。
让我们考虑一个更具说服力的Result返回类型的使用。假设您有一个执行以下操作的例程(我删除了gcd调用以保持对autoreleasepool的关注):
func generateAllImages() {
    for index in 0 ..< imageCount {
        let image = generateImage(for: index)
        updateUserInterface(for: index, with: image)
    }
}

假设在分析应用程序的过程中,我们发现隐藏在autoreleasepool中的东西创建了一个autorelease对象,这使得我们的应用程序的峰值内存使用率非常高。显然,您可以执行以下操作来降低应用程序的高水位线,在每次迭代时都会耗尽autorelease池:
func generateAllImages() {
    for index in 0 ..< imageCount {
        autoreleasepool {
            let image = generateImage(for: index)
            updateUserInterface(for: index, with: image)
        }
    }
}

但是如果您已经确认您的autorelease对象被限制在generateImage例程的范围内,您可以整理一下:
func generateAllImages() {
    for index in 0 ..< imageCount {
        let image = autoreleasepool { generateImage(for: index) }
        updateUserInterface(for: index, with: image)
    }
}

这不仅更加简洁,而且清楚地说明了autorelease对象是在哪里创建的。这个模式让我印象深刻,它非常自然地使用了返回其闭包返回的对象的generateImage行为。

关于swift - 从autoreleasepool内部快速退出循环?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56295396/

10-10 13:52