Xamarin na iOS

29. 8. 2013 12:56 zboj

V souvislosti se sérií článků o vývoji mobilních aplikací v Xamarinu zde na Rootu bych rád upozornil na nesmyslné tvrzení o správě paměti v iOS.

K diskusi o tom, odkdy má ObjC počítání referencí a autorelease pool, se nebudu vracet, k vygooglování této informace není zapotřebí zvláštní inteligence, stačí umět číst.

Není samozřejmě pravda, že GC (touto zkratkou v tomto článku myslím garbage collector à la .NET) je lepší nebo efektivnější než počítání referencí. Právě naopak, i když pochopitelně do značné míry záleží na implementaci. V iOS (a obecně v Cocoa) se vytváří autorelease pool pro každý průchod smyčky UI, tedy nějak následovně:

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; @try { // loop } @catch(NSException* exception) { // terminate } [pool drain];

GC v Cocoa (verze pro OS X) je konzervativní (s ukazateli by byl nějaký jiný použitelný jen s obtížemi) a tudíž metoda drain vyvolá uvolnění objektů, na něž neexistuje reference. Bez GC (a tedy i na iOS) prostě zruší autorelease pool smyčky a všem objektům v poolu sníží čítač referencí.

Xamarin by měl fungovat, pokud jsou jeho tvůrci chytří, v podstatě stejně. Je hezké, že tam má každý objekt standardně IDisposable, což z pohledu (formální) pragmatiky odpovídá lokálnímu zušení objektu v ObjC při použití ARC, ovšem opravdu efektivní je likvidace alespoň první generace objektů na haldě, na něž neexistuje reference, po každém průběhu smyčkou UI.

Pro zajímavost uveďme, že WinRT funguje v tomto ohledu přesně jako Cocoa ve spojení s ARC.

Sdílet

  • 30. 8. 2013 8:37

    mixal11 (neregistrovaný)

    Trochu od temy ale s Xamarinom. Mal som neprijemnu skusenosti, co sa tyka pamate a objektov, pri Xamarin na Androide - s vacsou app je problem zkrotit JNI Referencie, a potom mozu dosihanut max (2000 na emulatore, 52000 na device) a clovek co o JNI nevie moze hladat chybu... app "nahodne" crashuje, ani to nehodi casto vynimku do c#, proste crashne. Jedine riesenie je pouzivat IDposable a using. Ze by to Mono GC nejak casom uvolnoval som si nevsimol, ale nerypal som sa v tom moc.