我遇到了这个例外:
[__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
元素。
答案 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];