Литеральный синтаксис против предупреждений 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];
должен заставить компилятор замолчать.