【发布时间】: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