Ich muß sehen, ob ein Objekt, das ich aus einer CSV-Datei mit einer eindeutigen Kennung in meiner Core Data-Datenbank vorhanden ist, erhalten habe, und dies ist der Code, den ich für diese Aufgabe geeignet erachtet:Gibt es eine speichereffizientere Möglichkeit, eine Core Data-Datenbank zu durchsuchen?
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity;
entity =
[NSEntityDescription entityForName:@"ICD9"
inManagedObjectContext:passedContext];
[fetchRequest setEntity:entity];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"uniqueID like %@", uniqueIdentifier];
[fetchRequest setPredicate:pred];
NSError *err;
NSArray* icd9s = [passedContext executeFetchRequest:fetchRequest error:&err];
[fetchRequest release];
if ([icd9s count] > 0) {
for (int i = 0; i < [icd9s count]; i++) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
NSString *name = [[icd9s objectAtIndex:i] valueForKey:@"uniqueID"];
if ([name caseInsensitiveCompare:uniqueIdentifier] == NSOrderedSame && name != nil)
{
[pool release];
return [icd9s objectAtIndex:i];
}
[pool release];
}
}
return nil;
Nach gründlichem Testen scheint es, dass dieser Code für eine große Menge an Lecks in der App verantwortlich ist, die ich schreibe (es stürzt auf einem 3GS, bevor es 20 Prozent durch die 1459 Elemente macht). Ich denke, das ist nicht der effizienteste Weg, dies zu tun, irgendwelche Vorschläge für einen mehr speichereffizienten Weg? Danke im Voraus!
Gute Tipps, aber ich würde klären mag: Ich habe zwei Versionen des Pools, weil sie beide Ende in einer Rückkehr, könnten Sie sich selbst machen ein wenig klarer darüber, warum ich nicht zwei von ihnen haben sollte? Außerdem wurde die Abrufanforderung nach der letzten Verwendung freigegeben, sollte ich sie früher freigeben? –
@Kristian: Sie sollten nicht zwei Releases für einen Pool haben, weil Sie beide möglicherweise treffen können. Es ist üblich, dass der Code richtig beginnt, so wie Sie ihn haben, und später falsch gemacht wird, indem eine Rückgabebedingung (oder bedingungslos, die ein Leck verursacht) gemacht oder ersetzt wird. Sich nicht zu wiederholen, vermeidet dieses Problem. Sie müssen den Flow wie vorgeschlagen neu anordnen, um genau eine Anweisung zu erhalten, die den Pool entleert und sicherstellt, dass er immer passiert. –
Wie für die Freigabe der Abrufanforderung, ist mein Vorschlag, es prominent zu veröffentlichen, nicht die Veröffentlichung in der Mitte anderen Code begraben. Sie können es nicht früher freigeben, da Sie es in der unmittelbar vorhergehenden Anweisung verwenden. Sie können es jedoch automatisch freigeben, und genau das tue ich: Autorelease (fast) jedes Objekt sofort nach der Erstellung. –