mutableArrayValueForKey
не возвращает «массив», он возвращает прокси для «массива». Вы можете увидеть это, если распечатаете классы:
NSLog(@"%@", [self.array class]);
NSLog(@"%@", [[self valueForKey:@"array"] class]);
NSLog(@"%@", [[self mutableArrayValueForKey:@"array"] class]);
Это печатает:
2010-02-24 20:06:44.258 Untitled[25523:a0f] NSCFArray
2010-02-24 20:06:44.275 Untitled[25523:a0f] NSCFArray
2010-02-24 20:06:44.276 Untitled[25523:a0f] NSKeyValueSlowMutableArray
Прочтите документацию для mutableArrayValueForKey
, чтобы узнать, как работает этот прокси. В этом конкретном случае у вас есть настоящий NSMutableArray в качестве ивара. Но что, если бы не было такого ивара? Вы можете реализовать KVC без поддержки свойства ivar с помощью таких методов, как countOf<Key>
и objectIn<Key>AtIndex:
. Нет правила, что существует настоящий «массив» ivar, если вы можете возвращать разумные результаты в методы KVC.
Но что, если вы хотите предоставить интерфейс NSMutableArray, но у вас нет настоящего NSMutableArray? Вот для чего mutableArrayValueForKey
. Он возвращает прокси-сервер, который при обращении к вам будет преобразован в методы KVC, включая отправку вам мутировавшего во многие методы, такие как insertObject:in<Key>AtIndex:
.
Это даже происходит в том случае, если у вас есть настоящий ивар (как в вашем случае), вы просто не замечаете этого, потому что прокси ведет себя так же, как реальный объект.