22 votos

Cuando el uso de perezoso de la creación de instancias en iOS?

He escuchado que el perezoso de la creación de instancias de objetos en iOS es bastante común, sin embargo no estoy seguro exactamente cuando debo usar? Podría alguien dar una breve explicación de cuando debo usar lazy la creación de instancias y cuando yo debería inicializar mis propiedades en el método init?

Mi preocupación con respecto perezoso de la creación de instancias es que se requiere una gran cantidad de código (en comparación con sólo escribir todo esto en el método init), especialmente si usted tiene múltiples propiedades para inicializar.

12voto

Paul.s Puntos 23073

Para explicar mi comentario. A veces esta técnica es buena si tienes un objeto que sólo necesita ser configurado de una vez y tiene algunas de configuración involucrados que no desea saturar su método 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;
}

Se trata de un bonito ejemplo inventado, pero se puede empezar a ver el mérito. Los métodos deben ser como las clases y hacer una cosa así. Este método pasa a devolver el roundedView quiero. Si me dio una palmada a este código en el método init, a continuación, el método init ahora tendrían que saber los detalles nitty gritty de cómo crear y configurar este punto de vista y otros objetos a los que me bofetada en allí.

10voto

aleroot Puntos 30853

Es bueno en situaciones en las que los objetos que pueden tener una gran huella en la memoria, así que usted puede evitar para inicializar todos estos costosos objetos en el momento de la clase de contenedor de inicialización. La inicialización perezosa, se puede preservar el consumo de memoria en varias situaciones ...

Sin embargo es claro que si todos los objetos de las necesidades de inicialización después o inmediatamente después de que el contenedor de objeto de inicialización la inicialización perezosa no tiene ningún sentido y un estándar constructor de inicialización debe ser utilizado.

La inicialización perezosa debe ser utilizado en caso de tener objetos opcionales dentro de una clase que nunca podría ser inicializado durante todo el flujo de trabajo de clases .

9voto

Andrew Madsen Puntos 12967

Como con cualquier técnica, no hay una sola, uno-tamaño-caber-toda regla para saber cuando a perezosamente crear instancias de algo. Creo que un buen consejo es utilizar perezoso de la creación de instancias para las cosas que son caros para crear una instancia. Si algo tiene que hacer un montón de disco o de acceso a la red, o toma un montón de tiempo de CPU para configurar, eres mejor de diferir la que trabajo hasta que sea realmente necesario (o en el fondo). Especialmente para las características que un usuario puede o no puede usar, no tiene sentido perder un montón de tiempo en -init (o similar) configuración de las cosas, y al hacerlo puede contribuir a hacer que la aplicación se siente lento para el usuario.

Con eso dicho, se debe evitar la optimización prematura. No pasa mucho tiempo escribiendo código complicado para ayudar con el rendimiento hasta que hayas hecho las cosas de la manera obvia, se encontró un problema de rendimiento, y perfila su código de comprender a fondo el problema. Después de que hayas hecho esto, usted puede comenzar a hacer cambios para mejorar las cosas.

2voto

No sólo para la memoria y el rendimiento, mira esto, he aquí otro ejemplo:

- (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;
}

Usted puede utilizar perezoso de la creación de instancias para hacer un custom init o configuración especial y sí, también esto beneficia a la memoria y el rendimiento.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X