更改 nsdictionary 中的布尔值时的 EXC_BAD_ACCESS

Posted

技术标签:

【中文标题】更改 nsdictionary 中的布尔值时的 EXC_BAD_ACCESS【英文标题】:EXC_BAD_ACCESS when changing bool value in nsdictionary 【发布时间】:2013-07-05 19:11:51 【问题描述】:

我有一个arraynsdictionaries,每个字典都有一个boolean 值,我想在用户选择行时更改boolean 值。

但不知怎的,我得到了exc_bad_access

这是设置字典数组的方式:

self.choosedfiles=[[NSMutableArray alloc] init];
for (NSString *s in fileListINDoc)
        NSArray *partialDates =[s componentsSeparatedByString:@"."];//split string where - chars are found
        NSFileManager* fm = [NSFileManager defaultManager];
        NSDictionary* attrs = [fm attributesOfItemAtPath:[dataPath stringByAppendingPathComponent:s] error:nil];
        NSDate *dateLocal =(NSDate*)[attrs objectForKey: NSFileModificationDate];

        //creatre unique name for image _AKIAIVLFQKMSRN5JLZJA
        NSString *uniqueFileName=[NSString stringWithFormat:@"%@_AKIAIVLFQKMSRN5JLZJA_%@.jpeg",[partialDates objectAtIndex: 0],[partialDates objectAtIndex: 1]];

        BOOL isFileChoosen=NO;

        NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
                                dateLocal,@"date",uniqueFileName,@"imagename",s,@"name",isFileChoosen,@"isFileChoosen",
                                nil];
        [tempArray addObject:params];
    
    NSSortDescriptor *descriptor=[[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
    NSArray *descriptors=[NSArray arrayWithObject: descriptor];
    NSArray *reverseOrder=[tempArray sortedArrayUsingDescriptors:descriptors];

    self.files=[[NSMutableArray alloc] initWithArray:reverseOrder];

当我尝试更改布尔值时,这会导致错误,XCODE 将行 *params 字典显示为错误:

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

   NSDictionary *currentArticle = [self.files objectAtIndex:indexPath.row];
   NSNumber* ischoosenObject =[currentArticle objectForKey:@"isFileChoosen"];
    if ([ischoosenObject boolValue]==NO) 
        BOOL isFileChoosen=YES;
        NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:[currentArticle objectForKey:@"date"],@"date",[currentArticle objectForKey:@"imagename"],@"imagename",[currentArticle objectForKey:@"name"],@"name",isFileChoosen,@"isFileChoosen",nil];
        [self.files replaceObjectAtIndex:indexPath.row withObject:params];
        [self.choosedfiles addObject:[currentArticle objectForKey:@"name"]];


    

上面的代码可能是什么问题? 谢谢,

空格

【问题讨论】:

【参考方案1】:

Objective-C 集合类只能保存对象,不能保存原始类型,所以改一下:

BOOL isFileChoosen=YES;

收件人:

NSNumber *isFileChosen = [NSNumber numberWithBool:YES];

为了有效地包装你的布尔值在一个对象中。

(当然,这会对代码的其他部分产生一些影响)。

【讨论】:

感谢您的回答,但是为什么当我在 for 循环中设置字典但在 didSelectRowAtIndexPath 中不起作用时,`BOOL isFileChoosen=NO;` 有效? @SpaceDust 抱歉,我不知道为什么会这样。不过,我确信它会在某个时候中断。

以上是关于更改 nsdictionary 中的布尔值时的 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

ClassCastException:设置布尔数组值jsf时的uirepeat索引

如何区分 CoreData 中的布尔值和 NSNumber

选择相同值时的jQuery选择更改事件

获取上次更改值时的日期时间的高性能查询

NSPopupButton 在可可 XCode5 中更改其值时的通知

检查 NSDictionary 中的键 - 不使用布尔 NSNumber 作为值 @iOS8