Насколько осторожны вы с вашими типами возврата в Objective-C? - PullRequest
7 голосов
/ 23 сентября 2009

Скажем, у вас есть метод, который возвращает недавно сгенерированный экземпляр NSArray, который построен внутри с помощью NSMutableArray. Вы всегда делаете что-то вроде этого:

- (NSArray *)someArray {
    NSMutableArray *mutableArray = [[NSMutableArray new] autorelease];
    // do stuff...
    return [NSArray arrayWithArray:mutableArray];  // .. or [[mutableArray copy] autorelease]
}

Или вы просто оставляете объект изменяемого массива как есть и возвращаете его напрямую, потому что NSMutableArray является подклассом NSArray:

- (NSArray *)someArray {
    NSMutableArray *mutableArray = [[NSMutableArray new] autorelease];
    // do stuff...
    return mutableArray;
}

Лично я часто превращаю изменяемый массив в NSArray, когда возвращаюсь из методов, подобных этому, просто потому, что я чувствую, что он "безопаснее" или более "правильно" каким-то образом. Хотя, честно говоря, у меня никогда не было проблем с возвратом изменяемого массива, который был приведен к NSArray, так что это, вероятно, не проблема в реальности - но есть ли лучший метод для подобных ситуаций?

Ответы [ 3 ]

9 голосов
/ 23 сентября 2009

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

[NB: см. Предостережение Бомба ниже.]

5 голосов
/ 23 сентября 2009

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

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

0 голосов
/ 23 сентября 2009

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

Основы Какао-объектов

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...