20.3.06

Retaincount

Neulich bin ich beim Versuch die Mechanismen hinter retain und release zu verstehen auf einen seltsamen Effekt gestossen. Eigentlich sollte ein allokiertes Objekt direkt nach seiner Erzeugung einen retaincount von 1 haben, da auch nur eine einzige 'Leine' auf dieses Objekt existiert - sofern nichts weiter als eine Allokation passiert ist. Folgendes Experiment kann das aber leicht widerlegen:


int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

NSNumber *number = [NSNumber numberWithInt:5];
NSLog(@"retaincount:%i", [number retainCount]);
}


Die zu erwartende Ausgabe waere:

2006-03-20 23:08:14.173 versuch2[10287] retaincount:1


Tatsaechlich erhaelt man folgende Ausgabe:

2006-03-20 23:08:14.173 versuch2[10287] retaincount:2


Spielt man mit den Zahlen etwas wird das ganze noch seltsamer. Bis zur Zahl 12 erhaelt man immer einen retaincount von 2 nach der Allokation, danach erhaelt man 1. Ich habe das ganze mal im osxentwicklerforum gepostet. Die Loesung, laut Forum, ist wohl das haeufig verwendete Zahlen (also bis einschliesslich 12) im Framework zur Laufzeit gecacht werden, um schneller zur Verfuegung zu stehen. Eine NSNumber ist ein unveraenderlicher Container, hat man einmal einen erzeugt wird der wohl wiederverwendet. Sowas kann man ja testen - hab ich auch:


int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

NSNumber *number = [NSNumber numberWithInt:5];
NSLog(@"retaincount:%i", [number retainCount]);

NSNumber *number2 = [NSNumber numberWithInt:5];
NSLog(@"retaincount:%i", [number retainCount]);
}


Ergebnis:

2006-03-20 23:12:12.679 versuch2[16536] retaincount:2
2006-03-20 23:12:12.680 versuch2[16536] retaincount:3


Der retaincount erhoeht sich also tatsaechlich mit jeder Allokation eines Objektes mit demselben integer Wert.

Zumindest sind die Appleingenieure sparsam.

1 Comments:

Blogger Klapsenschaffner said...

Der Lemondasher ist abgehoben... sauber!!!

Auch, wenn ich keinen blassen Schimmer hab um was es hier genau geht :-)

5:20 PM  

Kommentar veröffentlichen

<< Home