NSJSONSerialization.JSONObjectWithData内存泄漏
我有一个使用NSJSONSerialization.JSONObjectWithData内存泄漏,json,swift,memory,memory-leaks,Json,Swift,Memory,Memory Leaks,我有一个使用NSJSONSerialization.JSONObjectWithData的函数,但一些内存没有释放。 因此,我跟踪了泄漏发生的位置,并使用以下功能对其进行了测试: private func test() { for var i = 0; i < 100000; i++ { let toParse = NSString(string: "{ \"Test\" : [ \"Super mega long JSON-string which is supe
NSJSONSerialization.JSONObjectWithData
的函数,但一些内存没有释放。
因此,我跟踪了泄漏发生的位置,并使用以下功能对其进行了测试:
private func test() {
for var i = 0; i < 100000; i++ {
let toParse = NSString(string: "{ \"Test\" : [ \"Super mega long JSON-string which is super long because it should be super long because it is easier to see the differences in memory usage with a super long JSON-string than with a short one.\" ] }").dataUsingEncoding(NSUTF8StringEncoding)!
let json = try! NSJSONSerialization.JSONObjectWithData(toParse, options: NSJSONReadingOptions(rawValue: 0))
}
}
这没有任何区别,因为Xcode建议这样做,我也尝试了:
autoreleasepool({ () -> () in
self.test()
})
但这也没用
注:也许我应该补充一点,我在
xcode7gm
中使用的是swift2.0
p.p.S:
test()
-函数是从
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), {
//... my code ...
self.test()
})
但这不会有任何区别…正如您在问题中指出的,应用程序会任意释放内存,因此它仍然没有释放并不意味着它会导致内存紧张 您可以尝试将测试例程封装在
自动释放池中,类似于Objective-C
func test() {
autoreleasepool {
// do the test
}
}
您误解了自动释放池的工作原理。自动释放池保留已分配的内存,直到释放该池。在自动释放池中调用循环100000次意味着该池没有机会释放任何内容,因此内存会累积。最终,当代码完成运行并释放自动释放池时,它就会消失,但与此同时,内存使用量会增加
正确的方法:
private func test() {
for var i = 0; i < 100000; i++ {
autoreleasepool {
stuff
}
}
}
private func test(){
对于变量i=0;i<100000;i++{
自动释放池{
东西
}
}
}
是的,我确实知道这一点,但我认为它会在应用程序离开test()后释放内存。。。但它没有。。。如果我使用你的代码,它是有效的;但是我不明白为什么它在测试()后不起作用。还有:谢谢
private func test() {
for var i = 0; i < 100000; i++ {
autoreleasepool {
stuff
}
}
}