1

我的问题是我有一个类型为 的类属性NSMutableArray,如我的头文件中所定义,但是当我尝试修改其中一个数组元素(an NSDictionary)时,我收到以下运行时错误:

2013-01-16 14:17:20.993 债务[5674:c07] *由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“-[__NSCFArray replaceObjectAtIndex:withObject:]: 发送到不可变对象的变异方法”

标头声明:

//  BudgetViewController.h

#import <UIKit/UIKit.h>

@interface BudgetViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
- (IBAction)afterTaxIncomeEditingDidEnd:(id)sender;
@property (strong, nonatomic) NSMutableArray *budgetArray;
@property (strong, nonatomic) IBOutlet UITextField *afterTaxIncome;
@property (strong, nonatomic) IBOutlet UITableView *budgetTableView;

@end

产生错误的方法:

-(void)applyCCCSWeights
{
    NSMutableDictionary *valueDict;
    NSString *newAmount;

    for (id budgetElement in [self budgetArray]) {
        valueDict = [[NSMutableDictionary alloc] initWithDictionary:budgetElement];
        newAmount = [NSString stringWithFormat:@"%0.2f", [[self afterTaxIncome].text floatValue] * [[budgetElement objectForKey:@"cccs_weight"] floatValue]];
        [valueDict setValue:newAmount forKeyPath:@"amount"];

        [[self budgetArray] replaceObjectAtIndex:0 withObject:valueDict];
        NSLog(@"%0.2f (%0.2f)", [[budgetElement objectForKey:@"amount"] floatValue], [[self afterTaxIncome].text floatValue] * [[budgetElement objectForKey:@"cccs_weight"] floatValue]);
    }

    [self.budgetTableView reloadData];
}

// 注意replaceObjectAtIndex:0上面只是一个占位符。这将替换为正确的索引。

4

4 回答 4

4

budgetArray肯定是不可变的,你必须创建它是可变的。

可能你正在做这样的事情:

budgetArray= [NSArray arraWithObjects; obj1, obj2, nil];

并忽略编译器警告。使其可变:

budgetArray= [[NSMutableArray alloc]init];
于 2013-01-16T19:33:16.623 回答
3

我相当确定您不能在枚举期间更改可变对象。

这个 SO 问题可能会有所帮助:在快速枚举问题期间设置对象

于 2013-01-16T19:54:37.077 回答
0

在您的 init 方法中,输入以下内容:

budgetArray = [[NSMutableArray alloc] init];

另外,为什么不使用字典和数组字面量语法呢?

-(void)applyCCCSWeights {
    NSMutableDictionary *valueDict;
    NSString *newAmount;

    for (NSDictionary *budgetElement in [self budgetArray]) {
        valueDict = [budgetElement mutableCopy];
        newAmount = [NSString stringWithFormat:@"%0.2f", [[self afterTaxIncome].text floatValue] * [budgetElement[@"cccs_weight"] floatValue]];
        valueDict[@"amount"] = newAmount;

        _budgetArray[0] = valueDict;
        NSLog(@"%0.2f (%0.2f)", [budgetElement[@"amount"] floatValue], [[self afterTaxIncome].text floatValue] * [budgetElement[@"cccs_weight"] floatValue]);
    }

    [self.budgetTableView reloadData];
}

请注意[[self budgetArray] replaceObjectAtIndex:0 withObject:valueDict];

变成:_budgetArray[0] = valueDict;

于 2013-01-17T01:57:12.873 回答
0

在对数组进行快速迭代时,您无法更改数组。另一方面,这完全没有必要。该代码绝对低效:只需制作数组 NSMutableDictionaries 的元素,然后直接更改字典,而不是创建副本然后更改副本中的元素。

稍后注意到您使用 NSJSONSerialization;看flag,不要盲目传0。

于 2014-03-17T00:03:55.070 回答