Domanda

(Solo per permetterti ora, sto imparando a sviluppare per iPhone con un libro che ho chiamato Inizio dello sviluppo di iPhone 3: Esplorazione dell'SDK e non utilizzo Interface Builder) C'è mai un motivo per usare il getter nella stessa classe, quando un membro privato è visibile? Come in Foo.h, avendo

NSObject *myObj;
...
@property (nonatomic, retain)NSObject *myObj;

e poi in Foo.m, accedendo al membro myObj usando self.myObj (o [self myObj])? Perché nel mio libro, ecco cosa ti dice di scrivere in una delle app (sta verificando se la vista di un membro di UIViewController è nella superview):

if(self.yellowViewController.view.superview == nil) {

(nota il .yellowViewController ...) C'è davvero una ragione per questo? Se non ho un'idea che ho forse è perché il membro blueViewController è di classe BlueViewController, quindi penso che se non vi è alcun motivo potrebbe non essere causa di confusione. Quindi c'è un momento in cui è necessario usare il getter nella stessa classe?

Grazie !!

È stato utile?

Soluzione

Sì, accedere ai tuoi ivar attraverso un getter che direttamente è una buona cosa da fare.

Ad esempio: uno dei normali schemi di progettazione in Cocoa (specialmente al telefono, dove le risorse sono molto limitate) è chiamato caricamento lento.

Riassumendo, significa che non caricare una risorsa fino a quando non è necessaria.

Idealmente, dovresti inserire il codice nel tuo getter per verificare se la risorsa richiesta è caricata e, in caso contrario, caricarla. L'accesso diretto all'ivar restituirebbe semplicemente zero. L'alternativa sarebbe quella di inizializzare tutti gli ivar quando viene avviata la classe genitore, potenzialmente sprecando risorse per archiviare dati che potrebbero essere o non essere necessari.

Ciò consente anche di posizionare potenzialmente risorse che potrebbero essere potenzialmente recuperate di nuovo nei metodi applicationDidReceiveMemoryWarning: e scaricarle quando le risorse si restringono, perché verranno caricate nuovamente su richiesta quando necessario.

Altri suggerimenti

Getter di caricamento lento:

- (UIImageView*) getImageView
{
    if (!imageView)
    {
        imageView = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @"blah.png"]]; // just an example
    }
    return imageView;
}

A seconda della definizione di imageView (copia, assegnazione, conservazione) è necessario modificare l'assegnazione effettiva, ma questo è ciò che si intende per caricamento lento.

Alcuni motivi per utilizzare la sintassi getter self.ivar invece di accedere direttamente alla variabile di istanza:

  • Proprietà a caricamento lento, come altri hanno menzionato
  • Le sottoclassi potrebbero voler sovrascrivere la proprietà e rispettare la superclasse che
  • Se usi le proprietà atomiche, l'unico modo corretto per accedere alla proprietà è tramite il getter
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top