Цель C - предпочтительный способ создания и инициализации объекта - PullRequest
5 голосов
/ 10 марта 2010

Является ли предпочтительным один из этих двух способов создания и инициализации объекта?

MyClass oClass = [[MyClass alloc] init];
oClass.length = 5;
oClass.text = @"Hello";

или используя метод класса, который содержит примерно такой же код, но выглядит так:

MyClass oClass = [MyClass myClassWithLength:(int) 5 andText:(NSString *) @"Hello"];

Я ненавижу, когда вижу, что дела идут не так, как есть, и понятия не имею, лучше ли одно, чем другое, или почему!

Ответы [ 4 ]

9 голосов
/ 10 марта 2010

Не будь ненавистником. : -)

Кстати, я полагаю, вы имели в виду:

( Редактировать: удалены ненужные приведения)

MyClass oClass = [[MyClass alloc] initWithLength:5 andText:@"Hello"];

Причина использования нескольких методов init ... состоит в том, чтобы разработчикам было удобнее создавать правильно инициализированные экземпляры. Так, например, если вы обнаружите, что разработчикам часто нужно создавать экземпляры MyClass с длиной и текстом, вы облегчаете им жизнь, предоставляя API, который позволяет им сделать это за один шаг. И если вы обнаружите, что разработчикам также часто приходится создавать экземпляры MyClass только с текстовой строкой, вы можете также предоставить метод -initWithText:.

И если экземпляры, созданные таким образом, часто используются как временные объекты (т. Е. Не хранятся в переменных экземпляра или статических переменных), вы также можете добавить вспомогательный метод класса, такой как +myClassWithText:, который возвращает автоматически выпущенный экземпляр MyClass, инициализированный с помощью предоставленная текстовая строка.

Что лучше: всегда лучше полностью инициализировать объект, когда это возможно, поэтому, если объект требует, чтобы оба значения были правильно инициализированы, используйте метод, который позволяет вам предоставить оба аргумента. И если вам не нужно хранить ссылку на создаваемый экземпляр, используйте удобный метод класса, чтобы вашему коду не приходилось иметь дело с управлением памятью.

2 голосов
/ 10 марта 2010

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

Однако я не думаю, что в этом вопросе есть абсолютная правда.

0 голосов
/ 10 марта 2010

Если доступен метод initWithSomething: и вы хотите предоставить начальные значения для этих свойств, я бы всегда предпочел его только потому, что он проще. Он также всегда будет работать даже с неизменяемыми версиями класса.

Но ни один из методов init по своей сути не "лучше". Классы обычно имеют один или два назначенных инициализатора, а все остальные просто вызывают те со значениями по умолчанию - это не обязательно оставляет свойства экземпляра без изменений. Документация для класса должна указывать, что делают его инициализаторы и какой назначенный инициализатор для класса. Например, [[NSDate alloc] init] использует назначенный инициализатор NSDate, initWithTimeIntervalSinceReferenceDate:, для создания объекта даты, представляющего текущую дату и время.

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

0 голосов
/ 10 марта 2010

Если у вас есть класс с множеством свойств, очень маловероятно, чтобы они были инициализированы в одной строке кода. Оба способа работают хорошо для меня.

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