2009-11-02 11 views
13

sto dichiarando una proprietà in una classe NSString e Objective-C si lamenta che:NSString alcun attributo 'assegnazione', 'trattenere', o 'copia' è specificato

NSString no 'assegnazione', ' retain ', o' copy 'l'attributo è specificato

Quindi casualmente mi fa sapere che "assegna è usato invece".

Qualcuno può spiegare a me la differenza tra assegnare, mantengono e copia in termini di normali C di gestione della memoria funzioni?

risposta

29

Penso che stia attirando la vostra attenzione sul fatto che viene utilizzato un assign, al contrario di retain o copy. Poiché un NSString è un oggetto, in un ambiente conteggiato di riferimento (ovvero senza Garbage Collection), questo può essere potenzialmente "pericoloso" (a meno che non sia intenzionale per progettazione).

Tuttavia, la differenza tra assign, retain e copy sono i seguenti:

  • assegnare: Nel metodo setter per la proprietà, c'è una semplice assegnazione della variabile istanza al nuovo valore , ad esempio:

    - (void)setString:(NSString*)newString 
    { 
        string = newString; 
    } 
    

    Ciò può causare problemi poiché oggetti Objective-C usano conteggio di riferimento, e quindi da non ritegno dell'oggetto, c'è una possibilità che la stringa potrebbe essere deallocata mentre la usi ancora.

  • conservano: questo mantiene il nuovo valore nel metodo setter. Per esempio:

    - (void)setString:(NSString*)newString 
    { 
        [newString retain]; 
        [string release]; 
        string = newString; 
    } 
    

    Questo è più sicuro, dal momento che si afferma esplicitamente che si vuole mantenere un riferimento dell'oggetto, e si deve rilasciarlo prima di essere deallocato.

  • copia: questo fa una copia della stringa nel metodo setter:

    - (void)setString:(NSString*)newString 
    { 
        if(string!=newString) 
        { 
         [string release]; 
         string = [newString copy]; 
        } 
    } 
    

    Questo è spesso usato con le stringhe, in quanto fare una copia dell'oggetto originale assicura che non è cambiato, mentre lo stai usando.

10

Il cacao utilizza il conteggio dei riferimenti per gestire la memoria. Gli oggetti con un conteggio di riferimento pari a 0 vengono cancellati.

  • assegnare - non fa nulla per fare riferimento a contare semplicemente punti la variabile ai dati
  • mantenere - sottolinea la variabile ai dati e aggiunge 1 al conteggio di riferimento, i dati è garantito per essere lì mentre la variabile è ancora vivo
  • copia - fa una copia dei dati, indica la variabile a esso e fa il conteggio conservano 1

Più particolare here, alla propria documentazione di Apple.

+1

mantenere - __even if__ qualcuno [deallocs] l'NSString a cui si fa riferimento? O funziona solo se ogni utente della stessa istanza [rilascia]? – bobobobo

+1

@bobobobo - non dovresti * mai * chiamare 'dealloc' te stesso. Dovresti * sempre * usare 'release' o' autorelease'. –

+0

Quello che Dave ha detto. Il motivo per cui i tuoi dati sono garantiti è perché tu presumi che tutti gli altri utilizzino solo la versione, riducendo il numero di riferimenti solo per riferimento. Se altre persone, o te stesso, passano dealloc o rilasciando un oggetto (quindi non seguendo le regole) i tuoi dati non sono garantiti! – bmalicoat

3

assign - l'ivar viene impostato eseguendo un semplice compito. Implementazione:

- (void) setFoo:(NSString *)newFoo { 
    foo = newFoo; 
} 

retain - l'Ivar viene inviato il messaggio di mantenere prima di fare l'assegnazione. Implementazione:

- (void) setFoo:(NSString *)newFoo { 
    if (foo != newFoo) { 
    [foo release]; 
    foo = [newFoo retain]; 
    } 
} 

copy - l'Ivar viene inviato il messaggio di copia prima di fare l'assegnazione. Implementazione:

- (void) setFoo:(NSString *)newFoo { 
    if (foo != newFoo) { 
    [foo release]; 
    foo = [newFoo copy]; 
    } 
} 
+1

Queste non sono le effettive implementazioni del compilatore @synthesizes, ma dimostrano il comportamento da una prospettiva di gestione della memoria (non GC). –

+0

@Nikolai - sì, grazie per il chiarimento. –

Problemi correlati