Ich habe ein benutzerdefiniertes Objekt namens Person
, dass unter anderem enthält ein NSString
Feld descriptor
genannt, die speichert, welche Art von Person, dass Person
Objekt (wütend, traurig, wild, glücklich , mürrisch, usw.). Alle meine Person-Objekte sind in einer NSMutableArray
, aber ich würde sie in einem NSMutableDictionary
in einer solchen Art und Weise zu speichern, wie:verschiedene Schlüssel Point gleiches Objekt (e) in NSMutableDictionary
Key: A, Objekt: Ein NSMutableArray
wo alle Person
Objekte mit ‚A‘ descriptor
Start
Key: B, Objekt: Ein NSMutableArray
wo alle Person
Objekte descriptor
beginnend mit 'B'
Key haben: C, Objekt: Ein NSMutableArray
wo alle Person
Objekte descriptor
beginnend mit 'C' etc haben ...
Ich habe versucht, dies in meinem Code unten zu tun, und am Kommentar // Punkt 1 scheinen die Tasten und Arrays übereinzustimmen, aber an // Punkt 2, wenn ich das komplette Wörterbuch alle ausdrucke Die Schlüssel ergeben die gleichen Werte!
Also wollte ich wissen, warum die NSMutableArray
scheint ich habe nicht gespeichert wird, wie ich es in der NSMutableDictionary
wollen?
- (void)buildDictionaryForIndexList {
NSMutableDictionary *tempDict = [[[NSMutableDictionary alloc] init] autorelease];
NSMutableArray *personsStartingWithLetter = [[NSMutableArray alloc] init];
NSMutableArray *indexList = [[[NSMutableArray alloc] init] autorelease];
NSInteger loopCounter = 1;
NSString *firstLetter = [[[NSString alloc] init] autorelease];
for (Person *v in persons) {
firstLetter = [[v descriptor] substringWithRange:NSMakeRange(0, 1)];
if ([indexList containsObject:firstLetter]) {
[personsStartingWithLetter addObject:v];
if (loopCounter == [persons count]) {
[tempDict setObject:personsStartingWithLetter forKey:firstLetter];
}
} else {
if (loopCounter > 1) {
//POINT 1
NSLog(@"%@",[indexList objectAtIndex:[indexList count]-1]);
for (Person *q in personsStartingWithLetter) {
NSLog(@"%@",[q descriptor]);
}
[tempDict setObject:personsStartingWithLetter forKey:[indexList objectAtIndex:([indexList count] - 1)]];
[personsStartingWithLetter removeAllObjects];
}
[indexList addObject:firstLetter];
[personsStartingWithLetter addObject:v];
} // else
loopCounter++;
} // for
//POINT 2
NSEnumerator *enumerator = [tempDict keyEnumerator];
for (NSString *str in enumerator) {
NSLog(@"%@",str);
for (Person *c in [tempDict objectForKey:str]) {
NSLog(@"%@",[c descriptor]);
}
}
self.dictionary = tempDict;
} // buildDictionaryForIndexList
So zum Beispiel bei POINT 1 meine Ausgabe ist:
A
Verärgerte
Liebenswürdig
B
Belligerent
C
Coole
...
W
Wilde
aber bei POINT 2 meiner Ausgabe ist
T
Wilde
J
Wilde
A
Wilde
...
W
Wilde
Erinnern Sie mich, warum in der Welt Sie tun '[[[[NSString Alloc] init] Autorelease]'? Gibt es dafür keine Helfer? Wie "Schnur"? –
Warum verwenden Sie überhaupt "Autorelease" in dieser Methode? Die Lebensdauer dieser Objekte ist nur auf diese Methode beschränkt, daher können Sie ihnen auch einfach die '-release'-Nachricht am Ende der Methode senden. –
@Jacob Relkin: Beschreibe es mit einem schlechten Speichermanagementstil. Aber, wenn ich all das geändert habe (und ich habe), stoße ich immer noch auf das gleiche Problem. – aqua