Pergunta

Eu sou um noob total a programação iPhone, e eu correr em uma exceção sendo lançada que eu simplesmente não pode envolver minha cabeça em torno.

Antecedentes: O erro está acontecendo em um subexibição costume, e ocorre imediatamente após o carregamento do programa. Estou recebendo uma exceção lançada no método drawRect substituído. O código jogando o erro seguinte:

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

starPaths é inicializada em awakeFromNib como um NSMutableDictionary com capacidade 1.

A exceção que está sendo jogado é - [NSObject doesNotRecognizeSelector:]

starPaths é declarado no cabeçalho do arquivo para a vista como

    NSMutableDictionary *starPaths;

e é inicializado como

- (void)awakeFromNib{
    starPaths = [NSMutableDictionary dictionaryWithCapacity: 1];
} 

Finalmente, eu não tenho sido capaz de chegar a um ponto no código onde eu adicionar com sucesso elementos ao dicionário, já que o código para adicionar uma entrada depende de receber uma resposta nula a partir do dicionário para saber que o que específica necessidades de entrada a ser construído.

Todas as sugestões? Qualquer outra informação devo fornecer? Qualquer ajuda em tudo seria apreciada, eu sinto como se estivesse faltando alguma coisa óbvia, mas eu tenho sido batendo minha cabeça contra isso o dia todo sem sorte.

Foi útil?

Solução

Se você não retain a variável starPaths ou explicitamente alocar-lo sozinho com [[NSMutableDictionary alloc] initWithCapacity:1] em seguida, ele será liberado automaticamente na próxima iteração do loop prazo.

Você precisa fazer

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

ou

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

Apenas certifique-se release-lo quando você não precisar mais dele.

Outras dicas

Algumas coisas para verificar:

  • é starPaths declarada como uma variável de instância * NSMutableDictionary? Você menciona que ele é inicializado. Você usou o método dictionaryWithCapacity (que retorna um objeto de auto-lançamento) ou initWithCapacity (que precisa ser explicitamente retidos). Para ser seguro, você pode querer mantê-lo e liberá-lo quando terminar.

  • Verifique duas vezes para garantir que os arquivos de cabeçalho estão devidamente incluído para que a declaração de starPaths está incluída em arquivos de implementação que fazer uso dela.

  • De um modo geral, se você está recebendo erros de mistério que tem a ver com a memória corrompida. Tente colocar um ponto de interrupção na primeira linha do método drawRect e fazer um "po starPaths" na janela do console depurador para ver o que está nele e que tipo de objeto o tempo de execução pensa que é.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top