Подтвердить что ты не робот

Когда использовать ленивый экземпляр в iOS?

Я слышал, что ленивое создание объектов в iOS довольно распространено, однако я не совсем уверен, когда я должен его использовать? Может ли кто-нибудь дать краткое объяснение, когда я должен использовать ленивый экземпляр, и когда я должен просто инициализировать свои свойства в методе init?

Моя забота о ленивом экземпляре заключается в том, что для этого требуется много кода (по сравнению с просто написанием всего этого в методе init), особенно если у вас есть несколько свойств для инициализации.

4b9b3361

Ответ 1

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

- (UIView *)myRoundedView;
{
    if (!_myRoundedView) {
        _myRoundedView = [[UIView alloc] initWithFrame:<#some frame#>];
        _myRoundedView.layer.cornerRadius = 10.f;
        _myRoundedView.backgroundColor    = [UIColor colorWithWhite:0.f alpha:0.6f];
        _myRoundedView.autoresizingMask   = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    }
    return _myRoundedView;
}

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

Ответ 2

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

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

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

Ответ 3

Как и в любой технике, нет ни одного правила одного размера для всех, чтобы рассказать вам, когда лениво создавать что-то. Я считаю, что хороший совет - использовать ленивый экземпляр для вещей, которые дорогостоящие для создания экземпляров. Если что-то нужно делать с большим количеством дискового или сетевого доступа или требуется много времени для настройки процессора, вам лучше отложить эту работу до тех пор, пока она не станет необходимой (или сделайте это в фоновом режиме). В частности, для функций, которые пользователь может использовать или не использовать, нет смысла тратить много времени на -init (или аналогичную) настройку, и это может способствовать тому, что ваше приложение становится вялым для пользователя.

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

Ответ 4

Не только для памяти и производительности, проверьте это, вот еще один пример:

- (NSArray *)validElements{
    if (!_validElements) {
        _validElements = [[NSArray alloc] initWithObjects:
                          @"mystuff",@"generaldescription",@"title",@"autor",
                          @"version",@"date",@"context",@"operatingsystem",@"kindofdevice",
                          @"deviceversion",@"rule",@"daytime",@"time",@"location",@"deviceheading",
                          @"region",@"language",nil];
    }
    return _validElements;
}

Вы можете использовать ленивый экземпляр для выполнения пользовательской инициализации или специальной конфигурации и да, это также приносит пользу памяти и производительности.