Aha, geheugenbeheer in Cocoa..... Ik doe een poging, maar dit is niet een van de eenvoudigste onderdelen van Cocoa/Objective C.
In het algemeen: Als je de NSString definieert binnen een methode, bijv. om een tijdelijke string manipulatie te doen hoef je je geen zorgen te maken. Bij het verlaten van de methode wordt de NSString automatisch vernietigd. Vb:
- (void)doSomething
{
NSString *theString;
.....
[theString doSomethingToIt];
....
}
Anders wordt het als je een NSString als instantie variable hebt van je class of als je een NSString meegeeft als parameter aan een method (bijv. om de waarde van een instantie te zetten). Dan komt geheugen management om de hoek kijken. In onderstaand voorbeeld wordt NSString theString gedefinieerd als instance variable van TheClass. Om de waarde van die instance variable uit te kunnen lezen en te kunnen schrijven worden twee accessor methods gedefinieerd: theString en setTheString... Immers, goed OO gebruik is dat je directe toegang tot je instance variables afschermt en de toegang regelt d.m.v. 'getters and setters'.
@interface TheClass:NSObject
{
NSString *theString;
}
- (void)setTheString(NSString *s);
- (NSString *)theString;
De implementatie van de 'accesor methods' setTheString en theString zien er als volgt uit:
- (void)setTheString(NSString *s)
{
[s retain];
[theString release];
theString = s;
}
- (NSString *)theString
{
return theString;
}
Daarnaast moet je n de init methode van de class theString alloceren;
- init
{
...
...
NSString *theString = [[NSString alloc] init];
...
}
En in de de dealloc methode van de class moet je de theString ook niet vergeten te dealloceren:
- (void)dealloc
{
...
...
[theString release];
}
Elk object kent een retain count; een tellertje dat bijhoudt hoeveel andere objecten een referentie hebben uitstaan naar het object. Dit tellertje wordt automatisch opgehoogd met een referentie maar kan ook handmatig worden opgehoogd met de methode retain en verlaagd met de methode release. Pas als een object een retain count heeft van 0 kan het netjes worden opgeruimd. Als je de retain count van je objecten in je programma niet in de gaten houdt, creeer je potentiele memory leaks omdat objecten nooit kunnen worden opgeruimd omdat je ze niet netjes weer vrijgeeft. In het voorbeeld van setTheString wordt theString gereleased voordat je de waarde toekent. Anders zou de retainwaarde op 2 komen (1 bij initialisatie en 1 in theSetString methode) maar je wilt alleen de waarde van theString wijzigen. Als je retain niet had gedaan in setTheString en je had het object theObject van class TheClass vernietigd, dan had theString niet vernietigd kunnen worden, want de release in de dealloc van de class was niet voldoende geweest om de retain count op 0 te zetten en aldus theString vrij te geven voor 'garbage collection'.
Meer info over geheugenmanagement (alloc, init, retain, release, autorelease, dealloc) kan je vinden in de Cocoa documentatie. En ook in dit artikel: http://cocoadevcentral.com/articles/000055.php