2015-09-11 22 views
0

我有一个使用NSJSONSerialization.JSONObjectWithData的函数,但是一些内存没有被释放。 所以我就找到了泄漏发生的位置,并具有以下功能进行了测试: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)) 
    } 
} 

我的应用程序之前,我叫test()为11 MB的内存使用率,内存使用率后为74.4 MB(即使我在我的应用中做了一些其他的事情,给系统一些时间来释放内存)...

为什么json没有发布?


芒迪指出我autoreleasepool我还没有试过(插入捂脸这里)......所以我改变了代码:

autoreleasepool { 
    self.test() 
} 

这并没有什么差别,并因为Xcode中提出的建议,我也试过:

autoreleasepool({() ->() in 
    self.test() 
}) 

但是,这也没有工作......


P.S .:也许我应该补充一点,我在Xcode 7 GM中使用Swift 2.0


PPS:该test()功能全是由内

dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), { 
    //... my code ... 
    self.test() 
}) 

称为但这不应有任何区别...

回答

2

您误解了自动释放池的工作原理。自动释放池保持分配的内存,直到池被释放。在自动释放池内调用循环100,000次意味着该池没有机会释放任何东西,因此内存会增加。最终它会消失,当代码完成运行并释放autorelease池时,但同时您的内存使用量会增加。

正确方法:

private func test() { 
    for var i = 0; i < 100000; i++ { 
     autoreleasepool { 
      stuff 
     } 
    } 
} 
+0

是啊,我也知道这一点,但我认为应用测试离开后,它会释放内存()......它没”如果我使用你的代码,它可以工作;但我不明白为什么它在测试后不工作()。 并且:谢谢 –

1

正如你在你的问题指出,应用程序任意释放内存,所以它仍然不是释放的事实并不意味着它会造成严重的内存条件。

您可以尝试将您的测试例程封装在autoreleasepool中,与Objective-C类似。

func test() { 
    autoreleasepool { 
     // do the test 
    } 
} 
+0

我试了一下,看到我的编辑 –