Objective c 为什么此代码在removeObject:处中断?

Objective c 为什么此代码在removeObject:处中断?,objective-c,nsmutablearray,Objective C,Nsmutablearray,如有必要,以下是validNumber的代码: + (NSString *)numberMatching: (NSString *)number and: (NSString *)secondNumber { NSString *returnNumber; if ([number isEqualToString:secondNumber]) { returnNumber = number; } else { NSMutableArray *validNu

如有必要,以下是validNumber的代码:

+ (NSString *)numberMatching: (NSString *)number and: (NSString *)secondNumber
{
   NSString *returnNumber;
   if ([number isEqualToString:secondNumber]) {
      returnNumber = number;
   } else {
      NSMutableArray *validNumber = [[self validNumbers] copy];
      [validNumber removeObject:number];
      [validNumber removeObject:secondNumber];
      returnNumber = validNumber[0];
   }
   return returnNumber;
}
运行时,我得到以下错误:

-[\u NSArrayI removeObject:]:无法识别的选择器已发送到实例0x1ed60f00。。。由于未捕获异常而终止应用程序 “NSInvalidArgumentException”,原因:'-[\u NSArrayI removeObject:]: 已将无法识别的选择器发送到实例0x1ed60f00'

这似乎表明removeObject不是NSMutableArray的有效方法,但它是有效的


本质上,我想做的是:如果两个参数匹配,我想返回值。如果它们不匹配,我想返回第三种可能性(两个参数都不匹配)。

因为
validNumber
NSArray
。您不能从
NSArray
中删除(或添加)对象。改为使用
NSMutableArray
mutableCopy

+ (NSArray *)validNumbers
{
   static NSArray *validNumbers = nil;
   if (!validNumbers) validNumbers = @[@"one",@"two",@"three"];
   return validNumbers;
}

因为
validNumber
是一个
NSArray
。您不能从
NSArray
中删除(或添加)对象。改为使用
NSMutableArray
mutableCopy

+ (NSArray *)validNumbers
{
   static NSArray *validNumbers = nil;
   if (!validNumbers) validNumbers = @[@"one",@"two",@"three"];
   return validNumbers;
}

当您将
copy
消息发送到
NSArray
时,您得到的副本也是一个
NSArray
实例,您无法从不可变数组中删除对象。为了获得可变副本,您需要发送
mutableCopy
消息:

NSMutableArray *validNumber = [[self validNumbers] mutableCopy];
[validNumber removeObject:number];
[validNumber removeObject:secondNumber];

当您将
copy
消息发送到
NSArray
时,您得到的副本也是一个
NSArray
实例,您无法从不可变数组中删除对象。为了获得可变副本,您需要发送
mutableCopy
消息:

NSMutableArray *validNumber = [[self validNumbers] mutableCopy];
[validNumber removeObject:number];
[validNumber removeObject:secondNumber];

我特别想让它成为一个可变数组。我认为非可变数组上的copy返回可变数组,反之亦然。不过,您的解决方案非常合理。我会试试看你的答案是否有效。编辑:这很有效,但为什么我不能在8分钟内接受你的答案?!?!是的,stackoverflow就是这样工作的。我不能在10分钟内给别人一个机会来提供一个(更好的)答案。我特别想让它成为一个可变数组。我认为非可变数组上的copy返回可变数组,反之亦然。不过,您的解决方案非常合理。我会试试看你的答案是否有效。编辑:这很有效,但为什么我不能在8分钟内接受你的答案?!?!是的,stackoverflow就是这样工作的。在10分钟内无法接受,以便给其他人提供(更好)答案的机会。此外,在可变数组上调用
copy
将为您提供该数组的不可变副本。此外,在可变数组上调用
copy
将为您提供该数组的不可变副本。