Pregunta

Soy un novato total a la programación de iPhone, y me he encontrado con una excepción que es lanzado que yo no puedo envolver mi cabeza alrededor.

Antecedentes: El error ocurre en un subvista costumbre, y se produce inmediatamente después de cargar el programa. Recibo un excepción lanzada en el método drawRect reemplazado. El código de tirar el error siguiente:

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

starPaths se inicializa en awakeFromNib como un NSMutableDictionary con capacidad 1.

La excepción que se les metan es - [NSObject doesNotRecognizeSelector:]

starPaths se declara en el archivo de cabecera de la vista como

    NSMutableDictionary *starPaths;

y se inicializa como

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

Por último, no he sido capaz de llegar a un punto en el código donde añado elementos de éxito al diccionario, ya que el código para añadir una entrada se basa en la recepción de una respuesta nula del diccionario para saber que el que específica la entrada tiene que ser construido.

¿Alguna sugerencia? Cualquier otra información que debería proporcionar? Cualquier ayuda en absoluto sería apreciada, siento que me falta algo obvio, pero he estado golpear mi cabeza contra esto todo el día sin suerte.

¿Fue útil?

Solución

Si no retain la starPaths variable o explícitamente asignar usted mismo con [[NSMutableDictionary alloc] initWithCapacity:1] entonces se libera automáticamente en la siguiente iteración del bucle de ejecución.

Es necesario hacer

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

o

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

Sólo asegúrese de que release cuando ya no lo necesite.

Otros consejos

Algunas cosas a comprobar:

  • ¿Se starPaths declarada como una variable de instancia NSMutableDictionary *? Usted menciona que se inicializa. ¿Utilizó el método dictionaryWithCapacity (que devuelve un objeto de liberación automático) o initWithCapacity (que debe ser retenido de forma explícita). Para estar seguro, es posible que desee conservar y liberarlo cuando haya terminado.

  • Compruebe para asegurarse de que los archivos de cabecera están correctamente incluidos por lo que la declaración de starPaths se incluye en los archivos de implementación que hacen uso de ella.

  • En general, si usted está recibiendo errores de misterio que tiene que ver con la memoria dañada. Trate de poner un punto de interrupción en la primera línea del método drawRect y hacer un "po starPaths" en la ventana de la consola depurador para ver lo que hay en él y qué tipo de objeto el tiempo de ejecución piensa que es.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top