Error de comstackción “método esperado no encontrado” cuando se utiliza el subíndice en NSArray

Escribí este código simple para probar la nueva syntax literal de Objective-C para NSArray s:

 NSArray *array = @[@"foo"]; NSLog(@"%@", array[0]); 

La primera línea funciona bien, pero la subscripción genera un error:

Método esperado para leer el elemento de matriz no encontrado en el objeto de tipo ‘NSArray *’

Me pregunto si he hecho algo mal, o si los literales no se han implementado por completo todavía. Estoy comstackndo con Apple LLVM 4.0 y usando el iOS 5 SDK.

Aquí hay una captura de pantalla del error, también.

Error

Debe comstackr con los SDK iOS 6 u OS X 10.8; de lo contrario, los objetos Foundation no tienen los métodos necesarios para el bit de suscripción de la syntax literal. * Específicamente en este caso, la suscripción espera que objectAtIndexedSubscript: sea implementado por NSArray , y ese es un nuevo método que se creó para interactuar con esta característica del comstackdor. Sin embargo, las partes de la nueva syntax que solo tienen que ver con la creación de objetos deberían funcionar bien; no creo que eso requiera ningún método nuevo.

Lectura adicional en http://clang.llvm.org/docs/ObjectiveCLiterals.html


* Baso esto en un poco de investigación realizada por borrrden: https://stackoverflow.com/a/11407844/603977

He obtenido muchos votos a favor en esta respuesta, que realmente siento que se basa en la de Borrrden. Por favor, si crees que mi respuesta merece un voto positivo, haz clic y vota allí también.

Si no tiene como objective iOS 6 u OS X 10.8, me gustaría señalar que todavía es notablemente fácil hacer que la subscripción funcione. Todo lo que tiene que hacer es agregar los métodos requeridos como categoría a las clases para las que desea trabajar, e implementar esos métodos de manera apropiada. Así que agrega a las siguientes clases los métodos:

NSArray : - (id)objectAtIndexedSubscript: (NSUInteger)index;

NSMutableArray : - (void)setObject: (id)obj atIndexedSubscript: (NSUInteger)index;

NSDictionary : - (id)objectForKeyedSubscript: (id)key;

NSMutableDictionary : - (void)setObject: (id)obj forKeyedSubscript: (id)key;

Implementar esto es tan simple como llamar al método apropiado para la clase. Por ejemplo, para implementar la suscripción en NSArray, simplemente implementa:

 - (id) objectAtIndexedSubscript:(NSUInteger)index{ return [self objectAtIndex:index]; } 

El único inconveniente que puedo ver es que debes asegurarte de importar tu categoría en cualquier clase que tenga la intención de usar la subscripción. Por supuesto, puede sortear ese requisito incluyendo el #import en su encabezado de prefijo, generalmente el archivo: -Prefix.pch . (gracias Josh Caswell por señalar eso).

Una ventaja es que puede modificar los métodos de suscripción para satisfacer sus necesidades. Por ejemplo, Apple no le permite agregar / eliminar objetos a NSMutableArray usando subíndices, pero esto se puede lograr con la suficiente facilidad:

  - (void) setObject:(id)obj atIndexedSubscript:(NSUInteger)index{ if (index < self.count){ if (obj) [self replaceObjectAtIndex:index withObject:obj]; else [self removeObjectAtIndex:index]; } else { [self addObject:obj]; } } 

Obtuve el mismo problema, pero no era una b / c de una versión de iOS que faltaba … pero era simplemente porque la matriz original estaba configurada como un NSArray lugar de un NSMutableArray . NSMutableArray a NSMutableArray arregló para mí

Obtuve el siguiente código de este enlace :

Simplemente puede agregar esta categoría a NSObject y la suscripción de recostackción funcionará. Lo puse en mi archivo .pch.

 // Add support for subscripting to the iOS 5 SDK. #if __IPHONE_OS_VERSION_MAX_ALLOWED < 60000 @interface NSObject (SubscriptingSupport) - (id)objectAtIndexedSubscript:(NSUInteger)idx; - (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx; - (void)setObject:(id)obj forKeyedSubscript:(id )key; - (id)objectForKeyedSubscript:(id)key; @end #endif 

Por supuesto, necesitará la versión más reciente de CLANG que ya se encuentra en XCode 4.4.

Estoy agregando esto porque este es un error común que todavía existe en Xcode a partir de 7/2015 y no es fácil encontrar la manera de resolverlo.

Recibí este error al intentar llamar a un método en un objeto sin haber creado una instancia del objeto. Mi solución fue crear una instancia del objeto, luego llamar al método en la propiedad en la instancia de ese objeto.

Ejemplo: Lo que no funcionó: [auto methodCall: arrayItem] (vea el ejemplo completo a continuación)

 [self tappedUser:self.activities[indexPath.row].followItem.user.givenName]; 

Lo que lo solucionó: ObjectClass newObject = arrayItem; [auto methodCall: newObject] (vea el ejemplo completo a continuación)

 FollowActivityItem *followItem = self.activities[indexPath.row]; [self tappedUser:followItem.user.givenName]; 

agregue #import a su archivo h, y use un NSMutableArray en NSMutableArray lugar

Si alguien llega a este hilo viejo después de obtener este error en Xcode 9.3 beta 4 con algún código antiguo de Objective-C como yo, aquí estaba mi solución.

Actualizar:

 @property (nonatomic, strong) id myObject; 

A:

 @property (nonatomic, strong) NSMutableArray *myObject;