Behält [NSMutableDictionary setValue: value forKey: key] den NSString-Schlüssel bei?

Wenn Elemente zu NSMutableDictionary using the mit der setValue:forKey: method (I suppose this generalizes to any Methode hinzugefügt werden (ich nehme an, dass dies auf NSObject) does the dictionary retain the second parameter, the verallgemeinert wird), behält das Wörterbuch den zweiten Parameter, den NSString? ?

Zum Beispiel:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
NSString *theString = @"hello";
int i;
for (i=0; i<[theString length]; i++){
    NSNumber *myInt = [NSNumber numberWithInt:i];
    NSString *character = [NSString stringWithFormat:@"%C",[theString characterAtIndex:i]];
    [dict setValue: myInt forKey:character];
}
[dict release];
[pool release];

Offensichtlich gibt es keinen Grund, myInt in the loop, it is retained by in der Schleife freizugeben, es wird von dict so it can't be released until the end of the code. But is the same true of beibehalten, so dass es nicht bis zum Ende des Codes freigegeben werden kann. Aber gilt das gleiche für character? My thinking is that if ? Meine Meinung ist, dass, wenn NSMutableDictionary stores the string in some other way, then one could create a temporary pool around the loop and release those strings instead of waiting until the release of the dictionary. die Zeichenfolge auf eine andere Weise speichert, dann könnte man einen temporären Pool um die Schleife erstellen und diese Zeichenfolgen freigeben, anstatt bis zur Veröffentlichung des Wörterbuchs zu warten.

Ich bin auch neugierig, warum retainCount of von character is 7fffffff as if it is an 7fffffff ist, als ob es ein NSConstantString, I would expect wäre, würde ich erwarten, dass stringWithFormat to return an ein NSString object which would need retaining, but that doesn't seem to be the case. Objekt zurückgibt, das beibehalten werden müsste, aber das scheint nicht der Fall zu sein.

Antwort auf "Behält [NSMutableDictionary setValue: value forKey: key] den NSString-Schlüssel bei? " 2 von antworten

Sie müssen character there, the dictionary retains it when you set it as a key and your own code has no need to retain it. dort nicht beibehalten, das Wörterbuch behält es bei, wenn Sie es als Schlüssel festlegen, und Ihr eigener Code muss ihn nicht beibehalten.

Sie brauchen sich auch keine Gedanken darüber zu machen, warum die Anzahl der Aufbewahrungen nicht das ist, was Sie erwarten. Vielleicht hat das Foundation-Framework Flyweight-ähnliche Instanzen einer Last von einstelligen NSString instances. In any case if you've got the memory management correct following the guidelines, you'll be OK regardless of what the framework's doing behind the scenes. -Instanzen. In jedem Fall, wenn Sie die Speicherverwaltung gemäß den Richtlinien korrekt haben, sind Sie in Ordnung, unabhängig davon, was das Framework hinter den Kulissen tut. http://iamleeg.blogspot.com/2008/12/cocoa-memory-management.html

Es ist sehr häufig in Kakao für NSString parameters to be copied instead of retained. That's because you could have just as easily given the dictionary an instance of Parameter kopiert statt beibehalten werden. Das liegt daran, dass Sie dem Wörterbuch genauso einfach eine Instanz von NSMutableString. Because the string's value could change, gegeben haben könnten. Da sich der Wert der Zeichenfolge ändern könnte, erstellt NSDictionary makes a copy. eine Kopie.

Aber unabhängig davon, wie NSMutableDictionary really operates, you don't have to worry whether wirklich funktioniert, muss man sich keine Sorgen machen, ob character needs to be retained. Once you've passed it to beibehalten werden muss. Sobald Sie es als Parameter an NSMutableDictionary as a parameter, it's really that class's problem to decide how to store the data, unless the documentation specifically tells you that retaining the objects are your responsibility. übergeben haben, ist es wirklich das Problem dieser Klasse zu entscheiden, wie die Daten gespeichert werden sollen, es sei denn, die Dokumentation weist Sie ausdrücklich darauf hin, dass die Aufbewahrung der Objekte in Ihrer Verantwortung liegt.

Ich würde mir auch nicht allzu viele Gedanken über das retainCount of any object. Following the retain count of an object too closely can lead you down rabbit holes that just make you spin your wheels. eines Objekts machen. Die Beibehaltungsanzahl eines Objekts zu genau zu verfolgen, kann Sie nach Kaninchenlöchern führen, die Sie nur dazu bringen, Ihre Räder zu drehen.

Schließlich glaube ich wirklich nicht, dass Sie hier Ihren eigenen Autorelease-Pool erstellen müssen. Wenn Sie nicht mit absoluter Sicherheit wissen, dass theString is going to be very long, or you've already observed high memory utilization in Instruments, adding the autorelease pool is an unnecessary optimization. sehr lang sein wird, oder Sie bereits eine hohe Speicherauslastung in Instruments beobachtet haben, ist das Hinzufügen des Autorelease-Pools eine unnötige Optimierung.