Ios Xcode在SWIFT中跳过自动释放池中的全部代码

Ios Xcode在SWIFT中跳过自动释放池中的全部代码,ios,xcode,swift,Ios,Xcode,Swift,我最近发现,截图代码在截图时使用了约140Mb的临时内存,从而生成4MB的JPEG。所以我把我的截图代码放在一个自动释放池中,如下所示 autoreleasepool{ UIGraphicsBeginImageContextWithOptions(cgSizeToUse, false, 0) webView.layer.renderInContext(UIGraphicsGetCurrentContext()) image = UIGrap

我最近发现,截图代码在截图时使用了约140Mb的临时内存,从而生成4MB的JPEG。所以我把我的截图代码放在一个自动释放池中,如下所示

    autoreleasepool{
        UIGraphicsBeginImageContextWithOptions(cgSizeToUse, false, 0)
        webView.layer.renderInContext(UIGraphicsGetCurrentContext())
        image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
    }

但现在当我调试时,自动释放池中的代码被完全跳过。这是我代码中唯一的自动释放池。有什么想法吗?

自动释放池中的代码确实在运行。只是您确定它是否运行的方法误导了您。

自动删除池中的代码确实运行。只是你确定它是否运行的方法会误导你。

表单
语句{…}
实际上是一个后跟块闭包的语句

块闭包确实在运行,但调试器将其本身视为一条语句。在块内的第一行上设置一个断点,就可以逐步完成块闭包

这是
autoreleasepool
的声明:

func autoreleasepool(code: @noescape () -> ())
因为它只需要一个闭包作为参数,所以我们可以随意删除paren并使用尾随闭包

有关
@noescape
的解释,请参阅此问题的答案:


编辑,因为Objective-C graybeard的命名错误。

表单
语句{…}
实际上是一个后跟块闭包的语句

块闭包确实在运行,但调试器将其本身视为一条语句。在块内的第一行上设置一个断点,就可以逐步完成块闭包

这是
autoreleasepool
的声明:

func autoreleasepool(code: @noescape () -> ())
因为它只需要一个闭包作为参数,所以我们可以随意删除paren并使用尾随闭包

有关
@noescape
的解释,请参阅此问题的答案:


编辑,因为Objective-C graybeard的命名错误。

“自动释放池中的代码被完全跳过”您如何知道?在调试器下浏览代码。我可以看到控件到达行“autoreleasepool{”当我在debugger中点击next按钮时,控件到达autoreleasepool的末尾。我有代码来验证屏幕截图是否被截取。但是如果你在autoreleasepool的第一行上放置一个断点,然后运行会怎么样?你最终会不会碰到那个断点?“autoreleasepool中的代码被完全跳过”你怎么知道?在调试器下遍历代码。我可以看到控件到达“autoreleasepool”行{“当我在debugger中点击next按钮时,控件到达autoreleasepool的末尾。我有代码来验证屏幕截图是否被截取。但是如果你在autoreleasepool的第一行上放置一个断点,然后运行该怎么办?你是否最终点击了该断点?