Memóriakezelés

BecomeAnXcoder – Memóriakezelés

Bevezető

Több fejezetben is sajnálkoztam, hogy nem magyarázok meg példákban szereplő utasításokat. Ezek mind memóriakezelő utasítások voltak. Fontos megérteni, hogy a te programod nem az egyedüli program a Macintosh-on és a RAM nem egy olcsó árucikk. Ezért amint a programodnak már nincs szüksége memória területre, akkor azt vissza kell szolgáltatnod a rendszernek. Amikor a mamád megtanított arra, hogy udvariasnak kell lenned és harmóniában élned a közösséggel, akkor éppen azt tanította meg, hogy hogyan kell programozni! Még akkor is ha csupán a te programod futna a számítógépen, fájdalmasan hazavághatja a programodat a fel nem szabadított memória és alaposan lelassíthatja a számítógépedet.

Szemétgyűjtés

Hivatkozás-számlálásnak (Reference Counting) nevezzük a Cocoa által használt memóriakezelési technikákat amiket bemutatunk ebben a fejezetben. Sokkal részletesebb magyarázatokat találhatsz ezekről a technikákról haladóbb könyvekben, cikkekben (lásd a 16. fejezetet).
A Mac OS X 10.5 Leopard bevezetett az Objective C számára egy új technikát, amit Szemétgyűjtésnek (Garbage Collection) nevezünk. A szemétgyűjtés technikája arra szolgál, hogy a rendszer automatikusan kezeli a memóriát és megszünteti a Cocoa objektumok megtartásának, felszabadításának a szükségességét.
A szemétgyűjtés varázslata minden NSObject, vagy NSProxy-ból öröklött Cocoa objektumra működik és lehetővé teszi a programozók számára, hogy rövidebb programkódokat írjanak, mint az Objective C korábbi verzióiban. Nem is kell erről tovább beszélni, felejts el minden mást ami ebben a fejezetben olvasható!

A szemétgyűjtés bekapcsolása

Mivel egy új Xcode projektben a szemétgyűjtés alapból ki van kapcsolva, nekünk kell azt bekapcsolni. A bekapcsoláshoz válaszd ki a Target alkalmazást a forrás listából és nyisd ki az Inspector-t. Válaszd ki az “Enable Objective-C Garbage Collection” opciót.

Hivatkozás-számlálás: Az objektum életciklusa

Ha érdekelnek a Leopard előtti memória kezelési technikák, akkor olvasd ezt tovább.
Amikor a programod készít egy új objektumot az elfoglal egy bizonyos memóriaterületet és neked ezt fel kel szabadítani amikor az objektumra már nincs tovább szükséged. Azaz, ha az objektum már nincs használatban, akkor el kell dobni. Azonban nem mindig könnyű megállapítani, hogy pontosan mikor is fejeződik be egy objektum használata.
Például a program futása során az adott objektumra további objektumok hivatkoznak, ezért addig nem szabad eldobni amíg lehetséges, hogy valamelyik másik objektumnak szüksége lehet rá (ha megpróbálunk egy már eltakarított objektumot használni, attól lefagyhat az egész program, vagy egészen váratlan működéshez vezethet).

A megtartási szám

A Cocoa úgy próbál segíteni abban, hogy mikor dobhatsz el egy objektumot, hogy minden objektumhoz hozzárendel egy számot, amit a nevének megfelelően az objektum megtartási számának neveznek. A programodban, amikor eltárolsz egy objektum referenciát akkor tudatni kell az objektummal, hogy meg kell növelnie a megtartási számot eggyel. Amikor eltörölsz egy objektum hivatkozást, akkor tudatni kell vele, hogy csökkentse a megtartási számot eggyel. Amikor egy objektum megtartási száma eléri a nullát, akkor az objektum tudni fogja, hogy már nincsen semmilyen hivatkozási kapcsolata és biztonságosan eldobható. Az objektum ezután eltakarítja magát és felszabadítja a megfelelő memória részt.
Példaként feltételezzük, hogy digitális zenedoboz alkalmazáson dolgozol ami zeneszámokat és lejátszási sorrendeket ábrázoló objektumokat tartalmaz. Feltételezzük, hogy egy adott zeneszám objektum három sorrend objektumhoz van hozzárendelve. Ha máshova nincs hozzárendelve, akkor a zeneszám objektumod megtartási értéke három.
28 Retain

Az objektum tudja, hogy hány alakalommal hivatkoznak rá, a megtartási számnak köszönhetően

Megtartás és felszabadítás

Egy objektum megtartási számát úgy tudod növelni, hogy küldesz neki egy megtartási üzenetet.

[anObject retain];

Egy objektum megtartási számát úgy tudod csökkenteni, hogy küldesz neki egy felszabadítási üzenetet.

[anObject release];

Automatikus felszabadítás

A Cocoa ezen kívül biztosít számodra egy automatikus felszabadítási készletet, amelyik lehetővé teszi a késleltetett felszabadítási üzenet küldését, nem rögtön, hanem valamikor később. Ehhez csak annyit kell tenned, hogy regisztrálod az objektumot egy automatikus felszabadítási készletbe azzal, hogy elküldöd az autorelease üzenetet.

[anObject autorelease];

Az automatikus felszabadítási készlet felügyeli a késleltetett felszabadítási üzenetet az objektumodhoz. Az eddigi programjainkban már találkoztunk a késleltetett felszabadítási készletet kezelő utasításokkal, amik segítségével utasítjuk a rendszert a korrekt felszabadítási készlet működtetésre.

eredeti oldal