NSMutableDictionary setValue:forKey有时会失败

时间:2014-07-27 07:19:05

标签: ios objective-c nsdictionary theos cydia-substrate

我使用NSMutableDictionary来保存3个键/值对。该值是以NSNumber形式的bool。 然后我有一个加载数据的表视图,如果按下单元格,则值从YES更改为NO,反之亦然。

按下单元格时,似乎正确更改了值,但字典中的最后一个键/值对除外

NSMutableDictionary *modsDict;
NSString *test = @"test";
NSString *test1 = @"test1";
NSString *test2 = @"test2";

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    NSString *key = [NSString stringWithFormat: @"%@", [[modsDict allKeys] objectAtIndex: indexPath.row]];

    if (cell.accessoryType == UITableViewCellAccessoryNone) {
        //enable
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        [modsDict setValue: [NSNumber numberWithBool: 1] forKey: key];
    }
    else {
        cell.accessoryType = UITableViewCellAccessoryNone;
        [modsDict setValue: [NSNumber numberWithBool: 0] forKey: key];
    }

}

-(void)viewDidLoad {

    %orig;

    modsDict = [[NSMutableDictionary alloc] init];
    [modsDict setObject: [NSNumber numberWithBool: 0] forKey:test];
    [modsDict setObject: [NSNumber numberWithBool: 0] forKey:test1];
    [modsDict setObject: [NSNumber numberWithBool: 0] forKey:test2];

    ... //init tableview

}

-(void)someMethodThatIHookTo {
    NSNumber *val = [modsDict objectForKey: test2];
    if ([val boolValue] == YES) {
        //do something
    }
    //this works for test and test1, but for test2 it crashed

   bool lol = [[modsDict objectForKey: test2] boolValue];
   if (lol) {
       //so something 
   }
   else {

   }
   //else is always called

   if ([[modsDict objectForKey: test2] boolValue]) {
   }
   else { }
   //if statement always true, never goes to else
}

这是我试图从NSDictionary获取价值的三种方式 我正在[NSNumber numberWithBool:0/1]因为如果我使用NO / YES,即使使用NO也会返回YES。

无论我按下牢房多少次, 3种方式的结果是相同的......

我该如何解决这个问题?

请注意我在THEOS上使用它,mobilesubtrate作为调整。

1 个答案:

答案 0 :(得分:3)

我想也许你需要更加努力地阅读文档。

以下是allKeys的文档说明的内容:

  

讨论
未定义数组中元素的顺序。

考虑到这一点,您认为代码中的以下片段会产生什么结果?

[[modsDict allKeys] objectAtIndex: indexPath.row]

这可能就是为什么你要发明迷信的信念,比如:

  

我正在[NSNumber numberWithBool:0/1]因为如果我使用NO / YES,即使使用了NO,也会返回YES。

记录:

  • 仅使用@YES@NO;
  • 是惯用的
  • [NSNumber numberWithBool:0][NSNumber numberWithBool:NO]不仅会返回相同值的数字,还会返回具有完全相同身份的数字,因为与NSNumber布尔值相关的特殊情况。同上YES /非零。

您的代码的修复是停止对具有未定义顺序的某些事物的顺序进行假设。可能只是使用数组,因为不清楚你为什么要使用字典。