我对以下代码有几个问题:
(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;
}
加里
答案 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添加内容时,它们将被这些数组或词典保留和管理。当您释放包含项目的数组或字典时,放入其中的项目将收到一条释放消息。