Доступ к массиву словарей? - PullRequest
0 голосов
/ 05 октября 2009

У меня есть пара вопросов относительно кода ниже:

(1) Является ли "newItem" автоматически выпущенным объектом? Как получить возвращенный словарь из указанного индекса массива?

(2) Есть ли простой способ получить доступ к массиву словарей за один удар, или я делаю это так, как вы ожидаете?

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSMutableArray *menu = [[NSMutableArray alloc] init];
    NSMutableDictionary *menuItem;
    NSMutableDictionary *newItem;

    NSArray *itemName = [NSArray arrayWithObjects:
                        @"Latte Medio",
                        @"Cappucion Medio",
                        @"Mocha Medio",
                        @"Vanilla Latte Medio",nil];

    NSArray *itemFat  = [NSArray arrayWithObjects:     
                        [NSNumber numberWithFloat:6.9],
                        [NSNumber numberWithFloat:4.7],
                        [NSNumber numberWithFloat:6.6],
                        [NSNumber numberWithFloat:6.9],nil];

    NSArray *itemCals = [NSArray arrayWithObjects: 
                        [NSNumber numberWithInt:516],
                        [NSNumber numberWithInt:408],
                        [NSNumber numberWithInt:624],
                        [NSNumber numberWithInt:743],nil];

    NSLog(@"DICTARRAY ... Start");

    // Create menuItem object
    menuItem = [[NSMutableDictionary alloc] init];
    [menuItem setObject:[itemName objectAtIndex:0] forKey:@"product"];
    [menuItem setObject:[itemFat objectAtIndex:0] forKey:@"fat"];
    [menuItem setObject:[itemCals objectAtIndex:0] forKey:@"calories"];

    // Add menuItem object to menu
    [menu addObject:menuItem];
    [menuItem release], menuItem = nil;

    // Access menu to get menuItem
    newItem = [menu objectAtIndex:0];
    NSLog(@"DATA: %@",[newItem objectForKey:@"product"]);
    NSLog(@"DATA: %@",[newItem objectForKey:@"fat"]);
    NSLog(@"DATA: %@",[newItem objectForKey:@"calories"]);

    // Clean up
    [menu release], menu = nil;
    [pool drain];
    return 0;
}

1008 * Гэри *

Ответы [ 3 ]

7 голосов
/ 05 октября 2009

То, как вы храните эту информацию, кажется странным. Вы храните все имена вместе, весь жир вместе и все калории вместе, когда действительно предметы (или объекты ), с которыми вы имеете дело, являются кофейными напитками. Вероятно, было бы проще создать новый объект, скажем, CoffeeDrink, который выглядел бы примерно так:

@interface CoffeeDrink:NSObject {
    NSString *name;
    NSNumber *fat;
    NSNumber *calories;
}

@property( retain ) NSString *name;
@property( retain ) NSNumber *fat;
@property( retain ) NSNumber *calories;

@end

Тогда в вашем коде вы можете иметь NSArray различных CoffeeDrink с.

1 голос
/ 05 октября 2009

newItem не является автоматически выпущенным объектом, он выглядит как указатель на menuItem, который (также) не является автоматически выпущенным.

Я предполагаю, что вы вынуждены хранить эту информацию в виде массивов по тем или иным причинам, и вы сознательно не пытаетесь сделать вашу жизнь более сложной. В этом смысле вы все еще можете немного упростить вещи.

Вы можете сделать все это в строке, но это, вероятно, превратится в "строку кода из ада". Я бы наверное написал так (псевдокод)

NSMutableDictionary* childDictionary  = // .. make the dictionary

// for each NSArray a
{
  NSString* k = // ... arbitrary key
  NSArray* a = [NSArray arrayWithObjects:// ... make the array with objects];
  [childDictionary addObject:a forKey:k];
}

// stuff it into the parent
NSDictionary* parentDictionary = [NSDictionary withObjects:childDictionary, nil forKeys:@"root"]; 
0 голосов
/ 05 октября 2009

в obj-c руководящие принципы Apple, как правило, когда метод / объект возвращает объект, который вам необходимо в конечном итоге освободить самостоятельно, имя метода начинается с «new», «copy», т.е.

newArray
copyArray

при добавлении объектов в NSArray или NSDictionary они будут храниться и управляться этими массивами или словарями. элементы, которые вы помещаете в них, получат сообщение о выпуске, когда вы освободите массив или словарь, содержащий ваши элементы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...