Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NSJSONSerialization.JSONObjectWithData内存泄漏_Json_Swift_Memory_Memory Leaks - Fatal编程技术网

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
        }
    }
}