Цель C — предпочтительный способ создания и инициализации объекта.

StackOverflow https://stackoverflow.com/questions/2417925

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top