将部分结果有效地存储到NSMutableDictionary中

时间:2011-08-19 17:50:07

标签: objective-c nsdictionary

target_results是一个NSMutableDictionary。这是将部分金额存储到列表中的有效方法吗?你能提出任何改进吗?

NSInteger temp_key = [rs intForColumn:@"some_int_field"];
NSInteger existing_value = [[target_results objectForKey:[NSNumber numberWithInteger:temp_key]] intValue];

if (existing_value > 0)
{
    //add to existing
    [target_results setObject:[NSNumber numberWithInteger:10+existing_value] forKey:[NSNumber numberWithInteger:temp_key]];
}
else
{
     //new entry
[target_results setObject:[NSNumber numberWithInteger:10] forKey:[NSNumber numberWithInteger:temp_key]];
}

1 个答案:

答案 0 :(得分:3)

最正确的优化方法是分析和查找实际瓶颈所在的位置(如果有)。那就是说,按照第一原则工作......

首先,不需要两次调用NSNumber(代码中三次,运行时两次)。每次调用都会创建一个新对象,因此会有内存分配开销。所以这是切入:

NSInteger temp_key_int = [rs intForColumn:@"some_int_field"];
NSNumber *temp_key = [NSNumber numberWithInteger:temp_key_int];

NSInteger existing_value = [[target_results objectForKey:temp_key] intValue];

if (existing_value > 0)
{
    //add to existing
    [target_results setObject:[NSNumber numberWithInteger:10+existing_value] forKey:temp_key];
}
else
{
     //new entry
[target_results setObject:[NSNumber numberWithInteger:10] forKey:temp_key];
}

if语句似乎也没有实现。所以你可以进一步减少代码:

NSInteger temp_key_int = [rs intForColumn:@"some_int_field"];
NSNumber *temp_key = [NSNumber numberWithInteger:temp_key_int];

// will create a new entry or replace an existing entry, as per the normal behaviour
// of NSMutableDictionary
NSInteger existing_value = [[target_results objectForKey:temp_key] intValue];
[target_results setObject:[NSNumber numberWithInteger:10+existing_value] forKey:temp_key];

我严重怀疑您会看到与该原始代码或原始代码有任何性能问题。但是,您将数据结构描述为列表,因此您可以考虑使用NSMutableArray而不是字典,假设您可以进行初始化步骤。