当我尝试替换Mutable Array项时遇到异常

时间:2012-02-17 13:36:12

标签: objective-c ios

我遇到了这个例外:

[__NSArrayI replaceObjectAtIndex:withObject:]: unrecognized selector sent to instance

当我尝试用另一个替换特定元素时:

修改 这是我的全部代码:

//declaring an AppDelegate instance
    AppDelegate *myAppDelegate=(AppDelegate *)[[UIApplication sharedApplication]delegate];

    //get the array in which we have stored all the choosed themes
    NSMutableArray *aMutableArray=myAppDelegate.themesChoosed;


    for (int i=0; i<[aMutableArray count]; i++) {
            NSString *str=[NSString stringWithString:[aMutableArray objectAtIndex:i]];
            if ([str isEqualToString:@"B1"]) {
                [aMutableArray replaceObjectAtIndex:i withObject:@"B2"];
          }
    }

我确信数组中确实存在B1元素。

3 个答案:

答案 0 :(得分:1)

在进入for循环之前,您的NSMuatbleArray会发生什么?

这是财产吗?如果是这样,财产申报是什么?您使用的是copy吗?

如果您实现这样的属性:

@property (nonatomic, copy) NSMutableArray *myArray;

...然后你可能遇到这样的问题,因为合成的setter将copy发送到数组,这导致了一个不可变的副本。如果是这种情况,您需要实现自己的setter,在数组上调用mutableCopy(或者只使用retain代替设计您的代码)。

编辑:

根据您在下面的评论和更新的代码,我确定问题必须与应用代理上的数组不可变有关。

试试这个:

NSMutableArray *mutableThemeseChoosed = [NSMutableArray arrayWithArray:myAppDelegate.themesChoosed];

答案 1 :(得分:0)

我刚试过你的代码,它运行正常。

NSMutableArray *aMutableArray = [NSMutableArray arrayWithObjects:[NSString stringWithString:@"A1"],[NSString stringWithString:@"B1"],[NSString stringWithString:@"B2"],[NSString stringWithString:@"A1"],[NSString stringWithString:@"A2"],[NSString stringWithString:@"A1"],[NSString stringWithString:@"A1"], nil];

NSLog(@"%@",aMutableArray);

for (int i=0; i<[aMutableArray count]; i++) {
    NSString *str=[NSString stringWithString:[aMutableArray objectAtIndex:i]];
    if ([str isEqualToString:@"B1"]) {
        [aMutableArray replaceObjectAtIndex:i withObject:@"B2"];
    }
}

NSLog(@"%@",aMutableArray);

答案 2 :(得分:0)

您的问题是 - 正如错误所示 - 您的可变数组是NSArray可变)

你从myAppDelegate.themesChoosed;得到的东西很可能是NSArray。请尝试以下操作:NSMutableArray *aMutableArray= [NSMutableArray arrayWithArray:myAppDelegate.themesChoosed];