【问题标题】:Why does this code break at removeObject:?为什么这段代码会在 removeObject: 处中断?
【发布时间】:2013-03-17 17:52:22
【问题描述】:
+ (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;
}

如果重要的话,这里是validNumber的代码:

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

运行时出现以下错误:

-[_NSArrayI removeObject:]: unrecognized selector sent to instance 0x1ed60f00 ... 由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'-[_NSArrayI removeObject:]: 无法识别的选择器发送到实例 0x1ed60f00'

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

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

【问题讨论】:

    标签: objective-c nsmutablearray


    【解决方案1】:

    因为validNumberNSArray。您不能从NSArray 中删除(或添加)对象。请改用NSMutableArraymutableCopy

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

    【讨论】:

    • 我特别想把它变成一个可变数组。我认为非可变数组上的复制返回一个可变数组,反之亦然。不过,您的解决方案非常有意义。我会尝试并检查您的答案是否有效。编辑:这行得通,但为什么我不能接受你的回答 8 分钟?!?!
    • 是的,stackoverflow 就是这样工作的。不能接受 10 分钟给其他人提供(更好的)答案的机会。
    【解决方案2】:

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

    NSMutableArray *validNumber = [[self validNumbers] mutableCopy];
    

    【讨论】:

    • 另外,在可变数组上调用 copy 会为您提供数组的非可变副本。
    猜你喜欢
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 2013-04-27
    • 2012-06-06
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多