2012-05-24 8 views
26

Ho sentito che l'istanziazione pigra di oggetti in iOS è piuttosto comune, tuttavia non sono esattamente sicuro quando dovrei usarlo? Qualcuno potrebbe dare una breve spiegazione di quando dovrei usare l'istanza pigra e quando dovrei inizializzare le mie proprietà nel metodo init?Quando utilizzare l'istanza lazy in iOS?

La mia preoccupazione relativa all'istanziazione lazy è che richiede molto codice (rispetto alla sola scrittura di tutto nel metodo init), specialmente se si hanno più proprietà da inizializzare.

+0

Come richiede molto codice rispetto a farlo in init? Generalmente non aggiunge molto di più del jus che fa le cose in init –

+0

Non ha senso in piccoli progetti e con nuovi dispositivi. Se ti preoccupi della memoria, devi usare l'istanza pigra. – ymutlu

+0

@ymutlu Puoi spiegare perché non ha senso in piccoli progetti e con nuovi dispositivi? –

risposta

18

Per elaborare il mio commento. A volte questa tecnica è utile se si dispone di un oggetto che deve essere configurato solo una volta e con alcune configurazioni coinvolte che non si vuole ingombrare il metodo 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; 
} 

È un esempio piuttosto ingegnoso ma è possibile iniziare a vedere il merito. I metodi dovrebbero essere come le classi e fare una cosa bene. Questo metodo si verifica per restituire la vista arrotondata che desidero. Se ho schiaffeggiato questo codice nel metodo init, allora il metodo init ora dovrebbe conoscere i dettagli nitidi di come istanziare e configurare questa vista e qualsiasi altro oggetto che schiaffo lì dentro.

11

Come in qualsiasi tecnica, non esiste un'unica regola valida per tutte le persone per dirti quando è necessario creare pigramente qualcosa. Penso che un buon consiglio sia usare l'istanziazione pigra per cose che sono costose da istanziare. Se qualcosa deve fare un sacco di accesso al disco o alla rete, o richiede un sacco di tempo per la CPU da configurare, è meglio rimandare quel lavoro finché non è effettivamente necessario (o farlo in background). In particolare per le funzionalità che un utente può utilizzare o meno, non ha senso sprecare un sacco di tempo in -init (o simili) impostando le cose, e così facendo si può contribuire a rendere l'applicazione più lenta all'utente.

Detto ciò, è necessario evitare l'ottimizzazione prematura. Non passare molto tempo a scrivere codice complicato per migliorare le prestazioni finché non hai fatto le cose in modo ovvio, hai riscontrato un problema di prestazioni e hai profilato il tuo codice per comprendere a fondo il problema. Dopo averlo fatto, puoi iniziare a fare cambiamenti per migliorare le cose.

13

È utile in situazioni in cui sono presenti oggetti che possono avere un ingombro di memoria elevato, pertanto è possibile evitare di inizializzare tutti questi oggetti costosi al momento dell'inizializzazione della classe contenitore. Inizializzazione pigra può preservare il consumo di memoria in diverse situazioni ...

Tuttavia è chiaro che se tutti gli oggetti necessitano di un'inizializzazione dopo o immediatamente dopo l'inizializzazione dell'oggetto contenitore, l'inizializzazione pigro non ha alcun senso e un costruttore standard l'inizializzazione dovrebbe essere usata.

Inizializzazione pigra dovrebbe essere utilizzata nel caso in cui siano presenti oggetti facoltativi all'interno di una classe che non potrebbero mai essere inizializzati durante tutto il flusso di lavoro della classe.

3

Non solo per la memoria e le prestazioni, check this out, ecco un altro esempio:

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

È possibile utilizzare esemplificazione pigri per fare un init personalizzato o configurazione speciale e sì anche questo va a beneficio della memoria e prestazioni.