Domanda

Sto iniziando a capire meglio la gestione della memoria in obiettivo-c, ma c'è qualcosa che non capisco. Questa è una dichiarazione di proprietà:

@property (nonatomic, retain)UILabel *myLabel;

e questo è il suo setter sintetizzato invisibile (penso):

- (void)setMyLabel:(UILabel *)newValue {
    if(myLabel != newValue) {
        [myLabel release];
        myLabel = [newValue retain];
    }
}

Il che ti fa risparmiare tutto il lavoro di conservazione e roba ogni volta, ma dire che ho impostato la mia proprietà per la prima volta, non è stata ancora assegnata, quindi il suo conteggio di riferimento è 0, giusto? Quindi lo faccio

UILabel *tempLabel = [[UILabel alloc] init];
self.myLabel = tempLabel;
[tempLabel release];

Non sono davvero sicuro di cosa succede lì, quando non rilascia nulla, ma diciamo che la proprietà ha già un valore e lo impostiamo. Nel setter, prima viene rilasciato. Quindi non lo fa sparire? Se il suo conteggio di riferimento è uno e quindi nel setter viene rilasciato, come può essere impostato sul nuovo valore mantenuto?

Grazie !!

È stato utile?

Soluzione

Penso che tu stia confondendo oggetti e riferimenti. Una proprietà è un riferimento a un oggetto, non all'oggetto stesso. Quando imposti o disinserisci una proprietà, invia gli oggetti conservati e rilasciati agli oggetti a cui punta, ma il riferimento stesso fa parte dell'oggetto in cui si trova la proprietà (in questo caso self).

Potrebbe essere utile leggere cose come pointers e lvalues ??.

Altri suggerimenti

Il valore iniziale di myLabel è zero, quindi la prima assegnazione alla proprietà, ovvero

self.myLabel = tempLabel;

rilascerà zero, cioè [rilascio zero]. Nell'obiettivo C, l'invio di un messaggio a zero è una no-op, quindi non farà nulla.

Allo stesso modo, nel tuo metodo dealloc, dovresti avere:

[myLabel release];

Che rilascerà myLabel se la proprietà è mai stata assegnata, bilanciando il [newValue retain] nel setter. Se la proprietà non è mai stata assegnata, sarà comunque nulla e la [versione nulla] sarà una no-op.

Leggi le regole di gestione della memoria per le regole esatte su quando è necessario conservare / rilasciare oggetti.

L'oggetto " scomparirà " (vale a dire, essere deallocato) quando tutte le proprietà su di esso sono state cedute. Cioè, quando (o poco dopo) tutte le allocazioni / copie / nuove chiamate sono state bilanciate con le chiamate di rilascio / rilascio automatico.

Sono relativamente nuovo anche in Objective-C, ma vorrei provare a rispondere per riaffermare la mia comprensione.

  

dire che ho impostato la mia proprietà per la prima volta, non è stata ancora assegnata, quindi il suo conteggio di riferimento è 0, giusto?

Sì, il conteggio delle trattenute è 0.

  

Nel setter, prima viene rilasciato. Quindi non lo fa sparire?

Sottrae 1 dal conteggio di mantenimento di myLabel . Se il conteggio di mantenimento di myLabel raggiunge 0, i dati o l'oggetto a cui punta la variabile myLabel verranno liberati dalla memoria.

  

Se il suo conteggio di riferimento è uno, e quindi nel setter viene rilasciato, come può rimanere per essere impostato sul nuovo valore mantenuto?

In quello scenario, i dati a cui punta myLabel verranno liberati (il conteggio dei conteggi sarà 0) e myLabel punterà quindi a zero (è vuoto). La variabile è impostata nella classe e sarà sempre disponibile ad accettare messaggi per quel setter, quindi i nuovi dati possono essere assegnati a myLabel indipendentemente dal fatto che il conteggio di conservazione di myLabel sia 0 o 100.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top