Agregar objeto a NSMutableArray en un NSMutableDictionary en otro NSDictionary

Entonces tengo un diccionario en un diccionario con matrices. Estoy tratando de agregar a las matrices que están en el segundo diccionario.

 [mealInfo setObject:[[NSMutableDictionary alloc]init] forKey:@"breakfast"];
 [[mealInfo objectForKey:@"breakfast"] setObject:[[NSMutableArray alloc] init] forKey:@"name"];
    [[mealInfo objectForKey:@"breakfast"] setObject:[[NSMutableArray alloc] init] forKey:@"detail"];
    [[mealInfo objectForKey:@"breakfast"] setObject:[[NSMutableArray alloc] init] forKey:@"ndb"];
    [[mealInfo objectForKey:@"breakfast"] setObject:[[NSMutableArray alloc] init] forKey:@"id"];
    [[mealInfo objectForKey:@"breakfast"] setObject:[[NSMutableArray alloc] init] forKey:@"alias"];

La creación parece estar funcionando solo agregando múltiples elementos a las matrices es donde termino con un error SIGABRT

agrego asi

[[[initMealInfo->mealInfo objectForKey:@"breakfast"] objectForKey:@"name"] addObject:[food_prop objectForKey:@"description"]];

Sé que estoy haciendo algo mal y me gustaría averiguar qué ayuda sería muy apreciada.

preguntado el 12 de junio de 12 a las 17:06

Intente dividir la línea y vea en qué parte falla:

asegúrese de que "[food_prop objectForKey:@"description"]" no sea nulo -

apuesto [food_prop objectForKey:@"description"] is nil -

¡Maldito @OmarAbdelhafith, eres 29 segundos más rápido que yo! -

@deanWombourne jeje, lo siento amigo, llegué primero :P -

1 Respuestas

En primer lugar, ¿estás usando ARC? De lo contrario, tienes muchos problemas.


Deberías leer sobre el Principio del Mínimo Conocimiento y el Ley de Demeter

Es hacer que la estructura sea más intuitiva:

    NSMutableDictionary *mealInfo = [[NSMutableDictionary alloc] init];

    NSMutableDictionary *breakfast = [[NSMutableDictionary alloc] init];
    [breakfast setObject:[[NSMutableArray alloc] init] forKey:@"name"];
    [breakfast setObject:[[NSMutableArray alloc] init] forKey:@"detail"];
    [breakfast setObject:[[NSMutableArray alloc] init] forKey:@"ndb"];
    [breakfast setObject:[[NSMutableArray alloc] init] forKey:@"id"];
    [breakfast setObject:[[NSMutableArray alloc] init] forKey:@"alias"];

    [mealInfo setObject:breakfast forKey:@"breakfast"];

Luego intente dividirlo un poco cuando intente ingresar información y envuélvalo en una función

-(void) addMealName:(NSString*) name forMeal:(NSString*) meal 
{
    NSMutableDictionary *meals = [mealInfo objectForKey:meal];
    NSMutableArray *mealNames = [breakfast objectForKey:@"name"];
    [mealNames addObject:name];
    [meals setObject:breakfastNames forKey:@"name"];
    [mealInfo breakfast forKey:meal];
}

Y llama

NSString *newMealName = [food_prop objectForKey:@"description"];
[initMealInfo addMealName:newMealName forMeal:@"breakfast"];

Respondido el 12 de junio de 12 a las 17:06

Tengo el mío funcionando pero me gusta tu solución. Ahora todos están hablando con las cosas correctas, pero me faltaba algo que era grande, básicamente estaba anulando la matriz y eso no era bueno. Ahora no lo soy y está funcionando. Lo tengo complicado de esta manera principalmente porque ahorrará muchas líneas de código y también ahorrará muchas llamadas a funciones internas que creo que son menos eficientes en comparación con el uso de las llamadas que están integradas en el sistema en general. Pero el tuyo funcionará y, por lo tanto, lo convertiré en la respuesta porque es un método más fácil de seguir que el mío. - Robar

Más eficiente no siempre significa menos líneas de código. El compilador a menudo comprimirá todo esto por ti. Piense también en el tiempo de depuración, ha tenido que pasar más tiempo pidiéndole a la gente que lo ayude a solucionar esto, lo que ha llevado más tiempo que escribir una solución más detallada. - James Webster

Sé que más comprimido no siempre es más eficiente, pero el diccionario del diccionario de matrices es un objeto que es local y elimina 30 llamadas a captadores y definidores en otro NSObject y lo trae todo localmente al que se hace referencia en una referencia O (1) . Además, mi referencia, ya que evita todas esas llamadas a funciones, conducirá a un lenguaje ensamblador más eficiente que dará como resultado una mayor eficiencia. Además, en relación con la depuración, en realidad lo arreglé bien cuando envié esto. Estaba transfiriendo estructuras de datos, lo que siempre es una gran tarea que conduce a errores y superposiciones. - Robar

Si su llamada de función única es O (1), entonces también lo es la mía, ya que solo está dividida en sus comandos individuales. Realmente no tiene que optimizar su ensamblaje, si lo hace, me preocuparía más por el diseño de su programa. Me preocuparía qué tan mantenible es su código. 30 getters y setters bien nombrados es mucho más eficiente en el tiempo que lleva escribir código que los problemas que encontrará tratando de recordar los nombres de las claves de su diccionario, etc. - James Webster

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.