Hepo kirjoitti:Applen koodeista kopio. Onhan se niin, että koska tuossa vapautetaan tuo olio, niin edellenin addOject metodi on ottanut kopion oliosta eikä pelkkää pointteria kopioinut? Meneekö se aina kaikissa metodeissa Objective-C:ssä tuolleen ja voi luottaa siihen että sen saa vapauttaa?
Sekoitat vähän C++/C:n ja Objective-C:n muistinhallinnat keskenään. Virgo kirjoittikin tuossa jo miten homma toimii. Lisäyksenä siihen vielä, että C++:ssa metodin parametreissa pointterilla yleensä siirretään omistajuus (eli omistaja on jatkossa vastuussa olion poistamisesta muistista). Objective-C:ssä on reference count, eli jokainen joka tarvitsee oliota johonkin, merkitsee tavallaan itsensä listalle, joita olio kiinnostaa (lisää reference countia yhdellä, eli kutsutaan retain). Sitten kun oliosta ei olla enää kiinnostuttu, niin kutsutaan release, joka pudottaa countia yhdellä. Sitten kun muutkaan eivät ole enää kiinnostuneita oliosta ja reference count on nolla, olio vasta tuhotaan.
Tuossa esimerkkikoodin tapauksessa olio tavallaan luovutettiin NSDictionarylle. Eli aluksi [ButtonsViewController alloc] lisää reference countin 1:ksi, kun olio luodaan. Sitten kun se lisätään NSDictionaryyn, niin RC kasvaa taas yhdellä (NSDictionaryn johdosta). Tämän jälkeen tehdään selväksi, ettei oliota enää tarvita NSDictionary ulkopuolella tässä metodissa ja tehdään release (RC -1). Sitten kun NSDictionary hävitetään, niin se tekee oliolle viimeisen releasen ja olio poistuu muistista.