访问字典数组?

时间:2009-10-05 15:28:05

标签: objective-c cocoa

我对以下代码有几个问题:

(1)“newItem”是一个自动释放的对象吗?它从指定的数组索引中获取返回的字典?

(2)有没有一种简单的方法可以在一次点击中访问一组dictionarys,或者我是按照你期望的方式进行的?

#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;
}

加里

3 个答案:

答案 0 :(得分:7)

您存储此信息的方式似乎很奇怪。当你正在处理的物品(或物品)是咖啡饮料时,你将所有的名字存放在一起,所有的脂肪和所有的卡路里在一起。制作一个新对象可能会更容易,比如说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 :(得分:1)

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"]; 

答案 2 :(得分:-1)

在obj-c中,苹果指南通常是当一个方法/对象返回一个你最终需要自己释放的对象时,方法名称将以“new”,“copy”开头,即:

newArray
copyArray

在向NSArray或NSDictionary添加内容时,它们将被这些数组或词典保留和管理。当您释放包含项目的数组或字典时,放入其中的项目将收到一条释放消息。