NSMutableDictionary lancia un doesNotRecognizeSelector a objectForKey?
-
21-08-2019 - |
Domanda
Sono un noob totale alla programmazione iPhone, e ho incontrato un'eccezione essere gettato che non riesco proprio a avvolgere la mia testa intorno.
Contesto: L'errore sta accadendo in una visualizzazione secondaria personalizzato, e si verifica immediatamente dopo il caricamento del programma. Ricevo un eccezione generata nel metodo drawRect override. Il codice di gettare l'errore seguente:
- (void)drawRect:(CGRect)rect{
NSNumber *points = [NSNumber numberWithInt: star.numberOfPoints];
//HERE. Doesn't recognize selector?!
CGPathRef t = (CGPathRef)[starPaths objectForKey:points];
/*snip*/
starPaths viene inizializzato in awakeFromNib come NSMutableDictionary con capacità 1.
L'eccezione che è sempre gettato è - [NSObject doesNotRecognizeSelector:]
starPaths è dichiarata nel file di intestazione per la vista, come
NSMutableDictionary *starPaths;
e viene inizializzato come
- (void)awakeFromNib{
starPaths = [NSMutableDictionary dictionaryWithCapacity: 1];
}
Infine, non sono stato in grado di arrivare a un punto nel codice in cui aggiungo con successo elementi al dizionario, dato che il codice per aggiungere una voce si basa su ricezione di una risposta pari a zero dal dizionario sapere che la specifica che l'ingresso deve essere costruita.
Qualche suggerimento? Qualsiasi altra informazione devo fornire? Qualsiasi aiuto a tutti sarebbe apprezzato, mi sento come se mi manca qualcosa di ovvio, ma mi è stato bashing la testa contro tutto il giorno senza fortuna.
Soluzione
Se non si retain
la starPaths
variabile o esplicitamente allocare da soli con [[NSMutableDictionary alloc] initWithCapacity:1]
allora uscirà automaticamente sulla prossima iterazione del ciclo di esecuzione.
Hai bisogno di fare
starPaths = [[NSMutableDictionary dictionaryWithCapacity:1] retain];
o
starPaths = [[NSMutableDictionary alloc] initWithCapacity:1];
Basta assicurarsi di release
quando non si ha più bisogno.
Altri suggerimenti
Un paio di cose da controllare:
-
È starPaths dichiarato come NSMutableDictionary * variabile di istanza? Si parla che viene inizializzato. Hai usato il metodo dictionaryWithCapacity (che restituisce un oggetto auto-release) o initWithCapacity (che deve essere esplicitamente mantenuto). Per essere sicuri, si consiglia di conservarlo e rilasciarlo quando fatto.
-
Doppio controllo per assicurarsi che i file di intestazione sono correttamente inclusi quindi la dichiarazione di starPaths è incluso nel file di implementazione che fanno uso di esso.
-
In linea generale, se stai ricevendo errori di mistero ha a che fare con la memoria corrotta. Prova a mettere un punto di interruzione sulla prima riga del metodo drawRect e fare un "
po starPaths
" nella finestra della console di debug per vedere cosa c'è dentro e che tipo di oggetto runtime pensa che sia.