Návod – Použití nástroje Instruments společnosti Apple
Tento článek vás provede použitím nástroje Instruments společnosti Apple k diagnostice problémů s pamětí v aplikaci pro iOS vytvořené pomocí Xamarinu. Ukazuje, jak spustit Instrumenty, pořazovat snímky haldy a analyzovat růst paměti. Ukazuje také, jak pomocí nástroje zobrazit a určit přesné řádky kódu, které způsobují problém s pamětí.
Tato stránka ukazuje, jak pomocí nástroje Instruments nástroje Xcode diagnostikovat problém s pamětí v aplikaci pro iOS. Nejprve si stáhněte ukázku MemoryDemo a otevřete řešení before v Visual Studio pro Mac.
Diagnostika problémů s pamětí
V Visual Studio pro Mac nástroje z položky nabídky Nástroje pro spuštění nástrojů spusťte Nástroje.
Upload aplikaci do zařízení výběrem položky nabídky Spustit Upload na Zařízení.
Zvolte šablonu Přidělení (oranžová ikona s bílým rámečem).

V seznamu Zvolit šablonu profilace pro v horní části okna vyberte aplikaci Ukázka paměti. Nejprve klikněte na zařízení s iOSem a rozbalte nabídku s nainstalovanými aplikacemi.

Stisknutím tlačítka Zvolit (v pravém dolním rohu okna) spusťte Instrumenty. Šablona ThiJs zobrazí v horním podokně dvě položky: Allocations (Přidělení) a VM Tracker (Sledování virtuálního počítače).
V části Instruments (Nástroje) stiskněte tlačítko Record (Záznam) (červené kolečko vlevo nahoře), které spustí aplikaci.
V horním podokně vyberte řádek Sledování virtuálního počítače (teď, když je aplikace spuštěná, bude obsahovat dva oddíly: Dirty (Neschůcené) a Resident Size (Místní velikost). V podokně inspektoru zvolte možnost Zobrazit Nastavení (ikona ozubeného kola) a potom zaškrtněte políčko Automatické pořizování snímků, které se zobrazuje v pravém dolním rohu tohoto snímku obrazovky:

V horním podokně vyberte Řádek přidělení (teď, když je aplikace spuštěná, se zobrazí Všechny haldy a Anonymní virtuální počítače).
V podokně inspektoru zvolte možnost Zobrazit Nastavení (ikona ozubeného kola) a potom klikněte na tlačítko Označit generaci a vytvořte základ. Na časové ose v horní části okna se zobrazí malý červený příznak.
Posuňte aplikaci a pak znovu vyberte Označit generaci (několikrát to zopakujte).
Klikněte na tlačítko Zastavit.
Rozbalte uzel Generace s největším růstem a seřa potom podle růstu (sestupně).
Změňte podokno inspektoruna Zobrazit rozšířené podrobnosti ("E"), které zobrazuje trasování zásobníku.
Všimněte si, > že uzel, který není objektem, vykazuje nadměrný růst paměti. Kliknutím na šipku vedle tohoto uzlu zobrazíte další podrobnosti – kliknutím pravým tlačítkem do trasování zásobníku přidejte do podokna umístění zdroje:

Seřadit podle velikosti a zobrazit rozšířené zobrazení podrobností:

Kliknutím na požadovanou položku v zásobníku volání zobrazíte související kód:

V tomto případě se pro každou buňku vytvoří nový obrázek a uloží se do kolekce, ani se znovu nevyužití existující buňky zobrazení kolekce.
Řešení problémů s pamětí
Tyto problémy je možné vyřešit a spustit aplikaci znovu pomocí nástroje Instruments.
Deklarováním jedné instance na úrovni třídy je možné image znovu použít a objekt buňky je možné znovu použít z existujícího fondu místo vytváření pokaždé, jak je znázorněno níže:
public override UICollectionViewCell GetCell (UICollectionView collectionView, NSIndexPath indexPath)
{
// Dequeue a cell from the reuse pool
var imageCell = (ImageCell)collectionView.DequeueReusableCell (cellId, indexPath);
// Reuse the image declared at the class level
imageCell.ImageView.Image = image;
return imageCell;
}
Když teď aplikaci spustíte, využití paměti se výrazně sníží – růst mezi generacemi se teď měří v Kib (kilobajty) místo MiB (megabajty), jak tomu bylo před opravou kódu:

Vylepšený kód je k dispozici v ukázce MemoryDemo v řešení after v Visual Studio pro Mac.
Tento blog komunity o uvolňování paměti Xamarin.iOS je užitečným odkazem pro řešení problémů s pamětí v Xamarin.iOS.
Souhrn
Tento článek předvedl, jak pomocí nástrojů diagnostikovat problémy s pamětí. Popisuje, jak spouštět nástroje z Visual Studio pro Mac, jak načíst šablonu přidělení paměti a jak pomocí snímků určit problémy s pamětí. Nakonec jsme aplikaci znovu prozkoumali, aby se ověřilo, že se problém vyřešil.