【问题标题】:iOS 8 Memory leak using String in Swift在 Swift 中使用 String 的 iOS 8 内存泄漏
【发布时间】:2015-03-02 21:40:25
【问题描述】:

我在使用 String (NSString) 组合和提取方法(例如 stringByAppendingPathComponent、lastPathComponent)时发现了内存泄漏问题。

我创建了一个示例循环(请参见下面的代码),当我在模拟器上运行它并且设备内存没有释放时。它需要千兆字节!即使循环结束后内存也不会减少。

我尝试使用 autoreleasepool {},但没有成功。

有谁知道为什么会发生这种情况以及如何解决这个问题?

我正在开发 Xcode 6.3 beta 2,包括带有 Swift 1.2 的 iOS 8.3 SDK

func memoryLeakTest() {

    for _ in 1...1000000 {

        let url = NSURL(scheme: "http", host: "google.com", path: "/")!
        let path = url.path
    }
}

自动释放池示例:

func memoryLeakTest() {

    for _ in 1...1000000 {

        autoreleasepool {

            let url = NSURL(scheme: "http", host: "google.com", path: "/")!
            let path = url.path
        }
    }
}

更新

问题仅发生在:
- Xcode 6.3 beta 2,包括带有 Swift 1.2 的 iOS 8.3 SDK

在以前的版本上执行的测试没有显示问题:
- Xcode 6.2 beta 5,包括带有 WatchKit 的 iOS 8.2 SDK
- Xcode 6.1.1

【问题讨论】:

  • 向我们展示您如何使用autoreleasepool
  • 内存可能不会在循环期间被清理,但应该在之后清理。 autoreleasepool 应该可以解决这个问题,但无论如何,你为什么每次都创建 NSURL,而不是重用同一个实例?你想在这里实现什么。
  • 这只是一个显示问题的虚拟代码。
  • 我刚刚测试了你的代码,当循环内容被包裹在autoreleasepool时没有发现问题
  • @blacksquare 你使用哪个 Xcode 版本?

标签: ios string swift memory-leaks ios8


【解决方案1】:

尝试在循环之前声明 url 和路径。

这应该会导致它重用相同的变量并释放以前的引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 2015-08-20
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多