2016-04-10 22 views
5

Chcę napisać rozszerzenie dla NSDictionary, więc mogę łatwo utworzyć go z danych. Napisałem to tak:Swift przecieki podczas korzystania z 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 } 
    } 
} 

Nie mogę dowiedzieć się, dlaczego to wycieka. Jakieś pomysły?

+0

Wyjaśnij, co masz na myśli przez nieszczelności – smac89

+0

masz rację, ktoś z mojego zespołu po prostu zabrakło profilera na aplikacji pracowaliśmy nad i znalazłem podobny problem – smac89

Odpowiedz

6

W moim przypadku okazało się, że problem polegał na drugim użyciu tego słownika, gdy próbowałem pobrać z niego subdictionary. A dokładnie w tym kodzie:

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

Problem polegał na tym, że otrzymałem geometryDictionary i referencje locationDictionary bez określenia ich typu, więc kompilator zakłada, że ​​są AnyObject. Nadal byłem w stanie uzyskać ich wartość jak ze słownika, więc kod zadziałał. Kiedy dodałem do nich typ, wycieki ustały.

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