Visual Memory Debugging z Xcode 8, czyli zarządzanie pamięcią
Istnieją narzędzia, które bardzo pomagają nam w zarządzaniu pamięcią podczas tworzenia aplikacji. Dzięki temu większość programistów rzadko spotyka się problemami z pamięcią (albo po prostu o nich nie wie). Raz na jakiś czas jednak musimy zmierzyć się z jakimś wyciekiem pamięci. Co wtedy robimy? Najbardziej powszechną metodą jest włączenie narzędzia Instruments i debugowanie problemu, co często jest dość mozolne. Apple wraz z wydaniem nowego Xcode’a 8 wprowadził nowe narzędzie, które znacznie nam to ułatwia – Visual Memory Debugger.
Tworzenie wycieku
Stworzymy prosty wyciek pamięci, by przetestować nowe narzędzie w praktyce. Najpierw tworzymy prostą klasę, której obiekt może trzymać referencję do innego obiektu tej samej klasy:
class LeakObject {
var other: LeakObject?
}
Następnie tworzymy równie prosty view controller. Będzie on trzymał referencję do obiektu klasy LeakObject. W metodzie viewDidLoad() stworzymy drugi obiekt tej samej klasy i wzajemnie je połączymy.
class MemoryLeakViewController: UIViewController {
@IBOutlet weak var button: UIButton!
let firstObject = LeakObject()
override func viewDidLoad() {
super.viewDidLoad()
let secondObject = LeakObject()
firstObject.other = secondObject
secondObject.other = firstObject
}
@IBAction func buttonAction(_ sender: AnyObject) {
if let navVC = navigationController {
navVC.popViewController(animated: true)
}
}
}
Dla ułatwienia stworzyłem przycisk, który usunie nasz view controller ze stosu nawigacyjnego. Każdy prawdopodobnie domyśla się co powinno się wówczas stać. Dzięki wzajemnej, silnej referencji obiektów klasy LeakObject pozostaną one w pamięci i powstanie wyciek. Przejdźmy więc do debugowania!
Visual Memory Debugger
Ikonka uruchamiająca debuggera pamięci znajduje się na prawo od ikonki debuggera widoków, z którego wszyscy programiści iOS dość powszechnie korzystają.
Debugger przerywa wykonanie aplikacji i pokazuje nam wizualizację użycia pamięci. Tak jak podejrzewaliśmy, po usunięciu view controllera powstał wyciek, o którym debugger skrupulatnie nas poinformował.
Główny ekran pokazuje wizualizację tych obiektów oraz ich relacji.
Po naciśnięciu na konkretny obiekt otrzymujemy szczegółowe informacje na jego temat.
Co więcej, Xcode poinformował nas w czasie działania programu o wycieku.
Po naciśnięciu na fioletową ikonkę, dostajemy szczegółowe dane na jego temat.
Na potrzeby artykułu został stworzony prosty wyciek pamięci, który został skrzętnie wyłapany przez Xcode i zwizualizowany przez nowy debugger pamięci. Narzędzie to z pewnością przyda nam się bardziej przy skomplikowanych problemach i w większych projektach. Nowy debugger jest intuicyjny i łatwy w użyciu. Zachęcam do wykorzystania go przy najbliższej możliwej okazji. Więcej informacji znajdziecie na prezentacji Apple z czerwcowego WWDC.