Ich habe einige Kerndaten-Code, der Apples sample code präzise folgt (die Abrufen von Attributwerten, die eine gegebene Funktion erfüllen Beispiel). Ich verwende es, um den Maximalwert eines Feldes zu erhalten, also kann ich es erhöhen, wenn ich das nächste Objekt dieses Entitätstyps einfüge.- [NSCFNumber count]: nicht erkannte Selektor
Ich konnte den Code überhaupt nicht funktionieren, bis ich meinen Store Type von NSXMLStoreType
zu NSSQLiteStoreType
wechselte, dann schien plötzlich alles zu funktionieren. Das ist jedoch nicht der Fall. Mir ist aufgefallen, dass es immer denselben Wert zurückgibt, selbst wenn ich Objekte mit einem höheren Wert eingefügt habe. Aber nachdem ich beendet und wieder geöffnet habe (und somit die Daten erhalten und wieder eingelesen wurden), würde es mit den neuen Einfügungen aktualisiert werden.
Also dann fing ich an, nach jedem Einsatz zu committen und zu speichern. obwohl nach der ersten „Autosave“, erhalte ich den Fehler unten (zweimal hintereinander):
- [NSCFNumber count]: Unbekannter Selektor an Instanz gesendet 0x100506a20
Dies geschieht (zweimal in Reihen), wenn ich führe die Abrufanforderung einmal:
NSArray *objects = [context executeFetchRequest:request error:&error];
aktualisiert
ich ließ meinen Code über das Zombie Instrument und konnte einen lo nehmen ok am Objekt, das den Fehler bekommt. Der Anruf, der malloc
ausführt, um es zuzuweisen, lautet: -[NSUserDefaults(NSUserDefaults) initWithUser:]
. Da ich keine eigenen Standardeinstellungen habe, weiß ich nicht, welches Objekt das sein könnte.
Update 2
I für „Freigabe“ durch alle meine Code gesucht und aus jeder release
oder autorelease
kommentierte, dass der statische Analysator über nicht beschweren. Ich habe immer noch die Fehler. Ich bin sogar so weit gegangen, jeden letzten release
/autorelease
in meinem Code zu kommentieren und habe es immer noch. Jetzt bin ich ziemlich sicher, dass mein eigener Code nicht übermäßig freigibt.
aktualisieren 3
This post scheint das gleiche Problem zu sein, aber seine Lösung nicht sinnvoll. Er hat den Ergebnistyp von NSDictionaryResultType
in NSManagedObjectResultType
geändert, was zu einem falschen Ergebnis führt. Anstatt einen einzigen Wert zurückzuerhalten (den von mir gesuchten max
), der jedes Objekt meiner Entitätsklasse im Kontext des verwalteten Objekts zurückgibt.
Hier sind die obersten Ebenen des Stack-Trace (wenn I es auf der Ausnahme zu brechen hat, das erste Mal).
#0 0x7fff802e00da in objc_exception_throw
#1 0x7fff837d6110 in -[NSObject(NSObject) doesNotRecognizeSelector:]
#2 0x7fff8374e91f in ___forwarding___
#3 0x7fff8374aa68 in __forwarding_prep_0___
#4 0x7fff801ef636 in +[_NSPredicateUtilities max:]
#5 0x7fff800d4a22 in -[NSFunctionExpression expressionValueWithObject:context:]
#6 0x7fff865f2e21 in -[NSMappedObjectStore executeFetchRequest:withContext:]
#7 0x7fff865f2580 in -[NSMappedObjectStore executeRequest:withContext:]
ich diese Frage auf zahlreiche Foren im Internet an anderer Stelle gesehen haben, aber niemand eine praktikable Lösung angeboten hat fachen Wunsch habe ich meine eigenen Der Name meiner Entität lautet Box
und die Eigenschaft, die ich versuche, den Wert von "sortOrder" zu erhalten, ist ein Int 32
Attribut.
NSManagedObjectContext *context = [MyLibrary managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Box"
inManagedObjectContext:context]];
// Specify that the request should return dictionaries.
[request setResultType:NSDictionaryResultType];
// Create an expression for the key path.
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"sortOrder"];
// Create an expression to represent the function you want to apply
NSExpression *expression = [NSExpression expressionForFunction:@"max:"
arguments:[NSArray arrayWithObject:keyPathExpression]];
// Create an expression description using the minExpression and returning a date.
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
// The name is the key that will be used in the dictionary for the return value.
[expressionDescription setName:@"maxSort"];
[expressionDescription setExpression:expression];
[expressionDescription setExpressionResultType:NSInteger32AttributeType];
// Set the request's properties to fetch just the property represented by the expressions.
[request setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]];
// Execute the fetch.
NSError *error;
NSNumber *requestedValue = nil;
NSArray *objects = [context executeFetchRequest:request error:&error];
NSLog(@"objects: %@", objects);
if (objects != nil && [objects count] > 0) {
requestedValue = [[objects objectAtIndex:0] valueForKey:@"maxSort"];
} else {
[[NSApplication sharedApplication] presentError:error];
}
[expressionDescription release];
[request release];
NSLog(@"Max Sort Order: %@", requestedValue);
return requestedValue;
Wenn Sie sagen, dass es Apple-Code genau folgt, meinst du, es ist buchstäblich Byte für Byte identisch oder könnten Sie möglicherweise, sagen wir, eine Instanzvariable anstelle einer lokalen Variablen an einem bestimmten Punkt verwenden? – Chuck
Kannst du deinen Code hinzufügen, wie du 'Anfrage' zusammenhältst? – vikingosegundo
Aber das ist nicht dein Code. – vikingosegundo