2010-03-12 7 views
14

Mi chiedevo se devo rilasciare un NSObject copiato? Per esempio, io creo un solo dizionario che copio in un array:Devo rilasciare un NSObjects copiato - Objective-c

Codice:

for (int num = 0; num < [object count]; num++) { 
    [dictionary setObject:[object objectAtIndex:num] forKey:@"x"]; 
    [array addObject:[dictionary copy]]; 
} 

Devo rilasciare il dizionario? Se sì quando?

Grazie

+0

+1 buona domanda – andy

+3

Proprio come una regola empirica, in Cocoa devi rilasciare tutto ciò che possiedi. Possiedi qualcosa se lo hai messaged con nuovo, copia, assegna o conserva. Se non hai chiamato uno di questi metodi, non lo possiedi e non dovresti rilasciarlo. –

risposta

24

Sì, lo fai. In questo caso, probabilmente si dovrebbe rilasciare la copia subito dopo aver aggiunto alla matrice, perché la matrice trattiene nulla aggiunto ad esso:

NSDictionary *copied = [dictionary copy]; 
[array addObject:copied]; 
[copied release]; 
+0

Grazie per le informazioni! – ncohen

4

Questo frammento da documentazione:

- (id) copia

Valore restituito L'oggetto restituito dal metodo di protocollo NSCopying copyWithZone :, dove la zona è nil.

Discussione Questo è un metodo comodo per le classi che adottano il protocollo NSCopying. Viene sollevata un'eccezione se non c'è implementazione per copyWithZone :.

NSObject non supporta il protocollo NSCopying. Le sottoclassi devono supportare il protocollo e implementare il metodo copyWithZone :. Una versione sottoclasse di copyWithZone: il metodo dovrebbe inviare il messaggio a super first, per incorporarne l'implementazione, a meno che la sottoclasse non discenda direttamente da NSObject.

Considerazioni speciali Se si utilizza la memoria gestita (non la garbage collection), questo metodo conserva il nuovo oggetto prima di restituirlo. L'invocatore del metodo, tuttavia, è responsabile del rilascio dell'oggetto restituito.

2

Con copy, si diventa proprietari dell'oggetto restituito. I contenitori assumono anche la proprietà degli oggetti aggiunti a loro.
Come risultato, devi rinunciare alla proprietà della copia come Noah ha sottolineato. Lo Cocoa memory management guidelines contiene una sezione che riporta how to work with containers.

0

È difficile dirlo, senza vedere dove si crea il dizionario, se questo è comunque ragionevole. Se non ci sono altri membri nel dizionario, sarebbe più semplice (anche se probabilmente più difficile da leggere :) fare qualcosa di simile

for (int num = 0; num < [object count]; num++) { 
    [array addObject:[NSDictionary 
          dictionaryWithObject:[object objectAtIndex:num] 
             forKey:@"x" 
        ] 
    ] 
} 

Quello è intenzione di darvi reali oggetti NSDictionary nella propria matrice, piuttosto che il NSMutableDictionary copie che stai creando.

+0

Su quali basi si sostiene che una copia di un NSMutableDictionary non sarebbe un "* reale * NSDictionary"? –

+0

Sulla base del fatto che un * reale * NSDictionary genererà errori se si tenta di inserire oggetti in esso. – Jeff

Problemi correlati