2009-07-01 5 views
2

Ich bin ein totaler Noob iPhone-Programmierung, und ich habe in eine Ausnahme geworfen geworfen, dass ich kann einfach nicht meinen Kopf wickeln.NSMutableDictionary löst einen doesNotRecognizeSelector auf objectForKey aus?

Hintergrund: Der Fehler tritt in einer benutzerdefinierten Unteransicht auf und tritt sofort beim Laden des Programms auf. Ich erhalte eine Ausnahme in der überschriebenen drawRect-Methode. Der Code, der den Fehler werfen folgt:

- (void)drawRect:(CGRect)rect{ 
    NSNumber *points = [NSNumber numberWithInt: star.numberOfPoints]; 
    //HERE. Doesn't recognize selector?! 
    CGPathRef t = (CGPathRef)[starPaths objectForKey:points]; 
/*snip*/ 

starPaths in awakeFromNib als NSMutableDictionary mit einer Kapazität initialisiert 1.

Die Ausnahme, die ausgelöst wird immer ist - [NSObject doesNotRecognizeSelector:]

starPaths erklärt in die Header-Datei für die Ansicht als

NSMutableDictionary *starPaths; 

und wird als

initialisiert

Schließlich war ich nicht in der Lage, zu einem Punkt im Code zu gelangen, wo ich erfolgreich Elemente zum Wörterbuch hinzufügen, da der Code zum Hinzufügen eines Eintrags auf das Empfangen einer Nullantwort aus dem Wörterbuch angewiesen ist Der spezifische Eintrag muss erstellt werden.

Irgendwelche Vorschläge? Irgendwelche anderen Informationen, die ich zur Verfügung stellen sollte? Jegliche Hilfe wäre willkommen, ich fühle mich, als würde ich etwas Offensichtliches vermissen, aber ich habe mir den ganzen Tag den Kopf dafür geschlagen, ohne Glück.

+1

Könnten Sie den relevanten Teil von watchFromNib veröffentlichen, in dem starPaths initialisiert wird? – marcc

+1

Auch die Instanzvariablendeklaration für starPaths. Gibt es Orte, an denen Sie erfolgreich Schlüssel-Wert-Paare zum Wörterbuch mit -setObject hinzufügen: forKey: usw.? –

Antwort

5

Wenn Sie nicht retain die starPaths Variable oder explizit zuweisen Sie es selbst mit [[NSMutableDictionary alloc] initWithCapacity:1] dann wird es automatisch bei der nächsten Iteration der Laufschleife freigegeben werden.

Sie benötigen

starPaths = [[NSMutableDictionary dictionaryWithCapacity:1] retain]; 

Oder

starPaths = [[NSMutableDictionary alloc] initWithCapacity:1]; 

einfach zu tun, um release es sicher, wenn Sie nicht mehr benötigen.

+3

Noch besser, verwenden Sie einfach einen Setter, wenn Sie eine Instanzvariable setzen möchten. Dadurch bleibt Ihr Code konsistent und die Last des Speichermanagements wird auf eine einzige Methode reduziert. – Chuck

+0

Das wäre in der Tat besser. – dreamlax

+0

Aha! Ich wusste nicht, dass das Wörterbuch aufgehoben würde, bevor es diesen Punkt erreichte. Beibehalten hat das Problem gelöst. Vielen Dank! – Zxaos

1

Ein paar Dinge zu überprüfen:

  • Ist starPaths erklärt als NSMutableDictionary * Instanz-Variable? Sie erwähnen, dass es initialisiert ist. Haben Sie die DictionaryWithCapacity-Methode (die ein Auto-Release-Objekt zurückgibt) oder InitWithCapacity (die explizit beibehalten werden muss) verwendet? Um sicher zu sein, möchten Sie es vielleicht behalten und es freigeben, wenn Sie fertig sind.

  • Überprüfen Sie, ob die Header-Dateien ordnungsgemäß enthalten sind, damit die deklaration von starPaths in Implementierungsdateien enthalten ist, die davon Gebrauch machen.

  • Im Allgemeinen, wenn Sie Mystery-Fehler bekommen, hat es mit beschädigten Speicher zu tun. Versuchen Sie, in der ersten Zeile der drawRect-Methode einen Haltepunkt zu setzen, und führen Sie im Debugger-Konsolenfenster einen "po starPaths" aus, um zu sehen, was darin enthalten ist und um welchen Objekttyp es sich bei der Laufzeit handelt.