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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top