0
votes
+ (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;
}

In case it matters, here is the code for validNumber:

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

When run, I get the following error:

-[_NSArrayI removeObject:]: unrecognized selector sent to instance 0x1ed60f00 ... Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_NSArrayI removeObject:]: unrecognized selector sent to instance 0x1ed60f00'

That would seem to indicate that removeObject is not a valid method for an NSMutableArray, but it is valid.

Essentially, what I want to do is this: if the two arguments match, I want to return the value. If they don't match, I want to return the third possibility (doesn't match either argument).

2

2 Answers

3
votes

Because validNumber is an NSArray. You can't remove (or add) objects from an NSArray. Use NSMutableArray and mutableCopy instead:

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

When you send the copy message to an NSArray, the copy you get is also an NSArray instance and you can't remove objects from an immutable array. In order to get a mutable copy you need to send the mutableCopy message:

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