Литеральный синтаксис против предупреждений mutableCopy и Objective-C

У меня больше опыта работы с Python, чем с чем-либо еще, поэтому работать с изменяемыми и неизменяемыми массивами и dicts немного странно. Я действительно наслаждаюсь буквальным синтаксисом, который добавил Xcode 4.5, но, делая некоторые несложные попытки, я сталкиваюсь с такой ситуацией:

NSArray *myArray = [@[/*array objects here*/] mutableCopy];
[myArray addObject: @/*an object goes here*/];

и компилятор выдает мне предупреждение, в котором говорится, что myArray может не отвечать на addObject.

Код компилируется и addObject работает просто отлично, я могу NSLog объект и убедиться, что он существует в myArray - но я не до конца понимаю природу этого предупреждения. Разве mutableCopy не возвращает NSMutableArray в этой ситуации? Более уместно просто использовать NSMutableArray и не тратить время на попытки (пере) использовать буквальный синтаксис?

Кроме того, поскольку это просто глупое предупреждение, могу ли я его игнорировать и продолжать? Это кажется... в худшем случае ленивым, и, возможно, просто откроет дверь для махинаций в будущем.

2 ответа

Решение

Вы должны объявить вашу переменную как NSMutableArrayне NSArray, addObject: метод доступен только на NSMutableArray,

РЕДАКТИРОВАТЬ: Вы также, кажется, есть ненужные @ там. Ваш код должен быть:

NSMutableArray *mutable = [@[a, b, c] mutableCopy];
[mutable addObject:d];

Разве mutableCopy не возвращает NSMutableArray в этой ситуации?

Оно делает. Вот почему вы должны присвоить возвращаемое значение NSMutableArray, а не NSArray.

NSMutableArray *myArray = [@[/*array objects here*/] mutableCopy];

должен заставить компилятор замолчать.

Другие вопросы по тегам