Objective C - предпочтенный способ создать и инициализировать объект

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

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

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

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

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

5
задан FreeAsInBeer 1 April 2011 в 18:35
поделиться

4 ответа

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

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

( Edit: удалили ненужные приведения)

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

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

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

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

9
ответ дан 13 December 2019 в 19:25
поделиться

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

0
ответ дан 13 December 2019 в 19:25
поделиться

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

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

2
ответ дан 13 December 2019 в 19:25
поделиться

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

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

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

0
ответ дан 13 December 2019 в 19:25
поделиться