使用NSJSONSerialization时,Swift存在内存泄漏问题

6
我想为NSDictionary编写一个扩展,以便从数据中轻松创建它。我写了以下代码:
extension Dictionary {
    init?(data: NSData?) {
        guard let data = data else { return nil }
        // TODO: This leaks.
        if let json = (try? NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions())) as? Dictionary {
            self = json
        }
        else { return nil }
    }
}

无法确定为什么会发生内存泄漏。有任何想法吗?


请解释一下“泄漏”是什么意思。 - smac89
你说得对,我的团队中有人刚刚在我们正在开发的应用程序上运行了一个性能分析器,并发现了类似的问题。 - smac89
1个回答

6

在我的情况下,问题出在我尝试从字典中获取子字典时后一种用法上。确切地说,在这段代码中:

var location: CLLocation? = nil
if let geometryDictionary = json["geometry"], locationDictionary = geometryDictionary["location"], latitude = locationDictionary["lat"] as? CLLocationDegrees, longitude = locationDictionary["lng"] as? CLLocationDegrees {
    location = CLLocation(latitude: latitude, longitude: longitude)
}

问题在于我接收到了geometryDictionary和locationDictionary的引用,但没有指定它们的类型,因此编译器假设它们是AnyObject类型。尽管如此,我仍然能够像从字典中获取值一样获取它们的值,所以代码可以正常工作。当我给它们添加了类型后,内存泄漏问题得到了解决。
var location: CLLocation? = nil
if let geometryDictionary = json["geometry"] as? [String : AnyObject], locationDictionary = geometryDictionary["location"] as? [String : AnyObject], latitude = locationDictionary["lat"] as? CLLocationDegrees, longitude = locationDictionary["lng"] as? CLLocationDegrees {
    location = CLLocation(latitude: latitude, longitude: longitude)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接