Насколько осторожный Вы с Вашими типами возврата в Objective C?

Лексически ограниченный по объему integer прагма Perl сил для использования целочисленной арифметики в ее объеме:

print 3.0/2.1 . "\n";    # => 1.42857142857143
{
  use integer;
  print 3.0/2.1 . "\n";  # => 1
}
print 3.0/2.1 . "\n";    # => 1.42857142857143

7
задан Sean 22 September 2009 в 21:32
поделиться

3 ответа

Раньше я делал return [NSArray arrayWithArray: someMutableArray] , но постепенно убеждался, что это не дает реальной пользы. Если вызывающий ваш API обрабатывает возвращенный объект как подкласс объявленного класса, он делает это неправильно.

[NB: См. Предупреждение bbum ниже.]

9
ответ дан 6 December 2019 в 15:24
поделиться

Очень часто приведение NSMutableArray возвращается как NSArray. Я думаю, что большинство программистов поймут, что если они понижают неизменяемый объект и видоизменяют его, то вносят неприятные ошибки.

Кроме того, если у вас есть NSMutableArray ivar someMutableArray , и вы вернете [NSArray arrayWithArray: someMutableArray] в методе доступа KVC, это может испортить KVO. Вы начнете получать ошибки «объект был освобожден, а наблюдатели все еще прикреплены».

5
ответ дан 6 December 2019 в 15:24
поделиться

NSArray на самом деле является кластером классов, во всяком случае, не типом. Так что везде, где вы видите NSArray, скорее всего, это уже один из нескольких разных типов. Поэтому выражение «преобразовать в NSArray» несколько вводит в заблуждение; NSMutableArray уже соответствует интерфейсу NSArray, и это то, с чем будет иметь дело большинство.

Основы CocoaObjects

В любом случае, учитывая, что вы возвращаете массив (и не сохраняете его впоследствии, благодаря автозапуску) вы, вероятно, не нужно беспокоиться о том, является ли массив изменяемым или нет.

Однако, если вы сохраняли массив, вы могли бы захотеть сделать это, чтобы клиенты не могли изменять его содержимое.

0
ответ дан 6 December 2019 в 15:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: