Propiedad ” no encontrada en el objeto del tipo ‘id’

Property 'aVariable' not found on object of type id cuando bash leer o escribir una variable en la matriz. ¿No debería saberse qué clase es el objeto que agregué? También noté que funciona para leer el valor con NSLog(@" %@",[[anArray objectAtIndex:0] aVariable]);

Soy un principiante en Objective C, así que podría ser algo simple que no entiendo.

Un objeto

 @interface AnObject : NSObject @property (nonatomic,readwrite) int aVariable; @end 

AnotherObject

 @interface AnotherObject : NSObject @end 

test.h

 #import "test.h" @implementation AnObject @synthesize aVariable; - (id)init { self = [super init]; if (self) { aVariable=0; } return self; } @end 

test.m

 @implementation AnotherObject - (id)init { self = [super init]; if (self) { } return self; } - (NSMutableArray*) addToArray { NSMutableArray* anArray = [[NSMutableArray alloc] initWithCapacity:0]; AnObject* tempObject = [[AnObject alloc] init]; tempObject.aVariable=10; [anArray addObject:tempObject]; // Property 'aVariable' not found on object of type 'id' [anArray objectAtIndex:0].aVariable=[anArray objectAtIndex:0].aVariable + 1; // Property 'aVariable' not found on object of type 'id' NSLog(@" %i",[anArray objectAtIndex:0].aVariable); // This works NSLog(@" %i",[[anArray objectAtIndex:0] aVariable]); return anArray; } @end 

Este código:

 [anArray objectAtIndex:0].aVariable 

Se puede dividir en 2 secciones:

 [anArray objectAtIndex:0] 

Esto devuelve una id , porque puedes poner cualquier tipo de objeto en una matriz. El comstackdor no sabe qué tipo va a devolver este método.

 .aVariable 

Esto es pedir la propiedad aVariable en el objeto devuelto por la matriz, como se indicó anteriormente, el comstackdor no tiene idea de qué es este objeto, ciertamente no asumirá que es un AnObject , simplemente porque eso es lo que agregó una línea o dos antes. Tiene que evaluar cada statement por sí mismo. El comstackdor por lo tanto le da el error.

Es un poco más indulgente al usar métodos de acceso:

 [[anArray objectAtIndex:0] aVariable]; 

Esto le dará una advertencia (que el objeto puede no responder al selector) pero le permitirá ejecutar el código, y afortunadamente su objeto responde a ese selector, por lo que no se cuelga. Sin embargo, no es seguro confiar en esto. Las advertencias del comstackdor son tus amigos.

Si desea utilizar la notación de punto, debe indicarle al comstackdor qué tipo de objeto se está devolviendo desde la matriz. Esto se llama casting . Puede hacer esto en dos pasos:

 AnObject *returnedObject = [anArray objectAtIndex:0]; int value = returnedObject.aVariable; 

O con un lío de corchetes:

 int value = ((AnObject*)[anArray objectAtIndex:0]).aVariable; 

Los corchetes adicionales son necesarios para permitir el uso de notación de puntos al lanzar. Si desea utilizar los métodos de acceso, necesita menos corchetes pero más corchetes:

 int value = [(AnObject*)[anArray objectAtIndex:0] aVariable]; 

-[NSArray objectAtIndex:] devuelve un puntero de id . Como id no contiene información sobre su protocolo, el comstackdor no puede saber que el objeto tiene esta propiedad que usted declaró; es por eso que se queja.

Puedes resolver esto lanzando el valor de retorno de objectAtIndex: o usando la notación getter / setter, es decir [anArray objectAtIndex:0] setAVariable:...] . También asegúrese de importar su definición de protocolo, de lo contrario, el comstackdor también podría desconocer el método declarado y emitir una advertencia.