2016-04-10 2 views
5

Я хочу написать расширение для NSDictionary, поэтому я могу легко создать его из данных. Я написал это следующим образом:Быстрые утечки при использовании NSJSONSerialization

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

Не могу понять, почему это происходит. Есть идеи?

+0

Объясните, что вы имеете в виду утечек – smac89

+0

Вы правы, кто-то из моей команды просто побежал профилировщик на приложении мы работали и нашли подобный вопрос – smac89

ответ

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) 
} 
Смежные вопросы