- Registriert
- 23.05.08
- Beiträge
- 115
Also ich bin grade dabei mich durch das Buch Objective C 2.0 von Stephen Kochan durchzuarbeiten, habe jetzt allerdings an einer Stelle arge Verständnissprobleme.
Und zwar geht es um einen Quelltext für eine Signum-Funktion. Das alles dreht sich um eine Klasse für gebrochene Zahlen (Fraction).
Hier mal der Quellcode um den es geht:
Und die methode add:
Nun zu dem, was meine Frage hervorbringt, dass was er dazu geschrieben hat:
Nun meine Verständnissfragen:
a) Wenn ich das Ergebnis einfach in sum schreiben würde, warum würde ein Speicherleck entstehen? Wird das Objekt nicht einfach überschrieben? Und warum ist das anders, wenn ich es in sum2 überschreibe?
b) Warum muss am Ende sum2 nicht auch freigegeben werden?
Ich hoffe mir kann das einer erklären, vor allem da mir das doch relativ wichtig erscheint.
Und zwar geht es um einen Quelltext für eine Signum-Funktion. Das alles dreht sich um eine Klasse für gebrochene Zahlen (Fraction).
Hier mal der Quellcode um den es geht:
Code:
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Fraction *aFraction = [[Fraction alloc] init];
Fraction *sum = [[Fraction alloc] init], *sum2;
int i, n, pow2;
[sum setTo: 0 over: 1]; //setzt den ersten Bruch auf 0
NSLog(@"Gib einen Wert für n ein:");
scanf("%i", &n);
pow2 = 2;
for (i = 1; i <= n; i++) {
[aFraction setTo: 1 over: pow2];
sum2 = [sum add: aFraction];
[sum release];
sum = sum2;
pow2 *= 2;
}
NSLog(@"Blabla Ausgabe %g", [sum convertToNum]); //gibt den Bruch als Dezimalzahl aus
[aFraction release];
[sum release];
[pool drain];
return 0;
}
Und die methode add:
Code:
-(Fraction *) add: (Fraction *) f
{
Fraction *result = [[Fraction alloc] init];
int resultNum, resultDenom;
resultNum = (numerator * f.denominator) + (f.numerator * denominator);
resultDenom = denominator * f.denominator;
[result setTo:resultNum over:resultDenom];
[result reduce]; //kürzt den Bruch
return result;
}
Nun zu dem, was meine Frage hervorbringt, dass was er dazu geschrieben hat:
Das Ergebnis von add: wird sum2 zugewiesen, nicht sum, um Speicherlecks zu vermeiden. (Was würde passieren wenn sie das Ergebnis direkt sum zuwiesen?)
[...]
Jetzt sind nur zwei Objekte zum freigeben übrig: aFraction und das finale Fraction-Object in sum.
Nun meine Verständnissfragen:
a) Wenn ich das Ergebnis einfach in sum schreiben würde, warum würde ein Speicherleck entstehen? Wird das Objekt nicht einfach überschrieben? Und warum ist das anders, wenn ich es in sum2 überschreibe?
b) Warum muss am Ende sum2 nicht auch freigegeben werden?
Ich hoffe mir kann das einer erklären, vor allem da mir das doch relativ wichtig erscheint.