2013-04-22 15 views
7

Qual è il ruolo della parola chiave copy nel ARCQual è il ruolo della "copia" nel ARC

trovo il (parola chiave) copy possono essere utilizzati in ARC mentre retain e release non possono essere utilizzati. Inoltre, il ruolo di copy in ARC corrisponde al ruolo di copy in MRC? Se sì, copy fa il retainCount +1 in ARC?

E ho visto Mike blog di cenere su Arche detto:

è necessario copiare esplicitamente blocchi che vengono passati come parametri id:

[myArray addObject: [^{ DoSomethingMagical(); } copy]]; 

ma quando prova codice come questo (senza usare copy) funziona bene anche.

NSArray *array = [[NSArray alloc] initWithObjects:^{NSLog(@"hahaha");}, nil]; 

[self test:[array objectAtIndex:0]]; 

- (void)test:(void (^)(void))completion 
{ 
       completion(); 
} 

Vuol dire che non v'è alcuna necessità di copy blocco quando usato come un tipo id?

+1

Il numero di ritenzione non aumenta utilizzando la copia in MRC o in ARC. – Rakesh

+3

@rakesh più preciso nel dire "il numero di ritardi * potrebbe * essere aumentato in ARC/MRR" in quanto è un dettaglio di implementazione. Per NSMutableString? Ne ottieni una copia Per NSString? Arresta il conteggio dei ritardi di uno e restituisce lo stesso oggetto. – bbum

+0

Si noti che il blocco nell'esempio è probabilmente un blocco statico e, pertanto, il proprio codice potrebbe "funzionare" solo per coincidenza. – bbum

risposta

5

Sì, il ruolo di copy nel ARC è la stessa come il ruolo del copy in MRR

Il copy invocherà il metodo copyWithZone:. quando invia all'oggetto mutabile, restituisce un oggetto immutabile clone, che retainCount è 1. Quando viene inviato all'oggetto immutabile, non verrà copiato, restituirà l'oggetto stesso, ma il retainCount +1.

Così, quando si utilizza copia ARC, è possibile utilizzare in questo modo: object1 = [object2 copy]; ARC gestirà il retainCount del object1, quando l'allora object1 viene rilasciato da ARC, il object2 s' retainCount sarà una corrispondente variazione. Quindi non ti preoccupare per la memoria.

Informazioni su block devono essere copy quando passano come parametri id.

il apple document detto:

In genere, non dovrebbe essere necessario copiare (o mantenere) un blocco. È solo necessario eseguire una copia quando si prevede che il blocco venga utilizzato dopo la distruzione dell'ambito entro il quale è stato dichiarato. . Copia muove un blocco all'heap

e As ughoavgfhw said:

blocchi sono simili ad altri oggetti per la gestione della memoria, ma non la stesso. Quando viene creato un blocco che accede a variabili locali, viene creato nello stack . Ciò significa che è valido solo finché esiste l'ambito . Per salvare questo blocco per dopo, è necessario copiarlo, che lo copia nell'heap

1

Quando si utilizza copy in ARC, fa lo stesso come senza ARC, cioè crea una copia dell'oggetto che sta ricevendo la copia (crea una nuova istanza di oggetto in memoria) e crea una relazione strong con oggetto che esegue il codice.
Ciò significa che la copia dell'oggetto ora ha un conteggio di ritenzione pari a 1, ma questo non è rilevante per l'utente in ARC, poiché viene gestito automaticamente.

4

La copia esegue esattamente ciò che il nome implica. Restituisce una copia dell'oggetto. Supponi di avere un oggetto mutabile e di avere un puntatore. Quindi fai riferimento ad esso da qualche altra parte nel codice e ARC assumerà che tu voglia indirizzare lo stesso oggetto e conservarlo per te. In questo caso, se modifichi entrambi, entrambi rifletteranno le modifiche. Se si punta ad essa con un copy si otterrà un nuovo oggetto, e la modifica di uno di essi, l'altro:

NSMutableArray* objA = [NSMutableArray new]; 
NSMutableArray* objB = objA; 
/* adding an object to either will be in both since they point to the same object*/ 
objB = [objA mutableCopy]; 
/*adding an object to one WILL NOT affect the other, they are different, distinct objects*/ 

nella documentazione qui:

http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxVariables.html#//apple_ref/doc/uid/TP40007502-CH6-SW1

Si afferma che quando i blocchi vengono copiati tutti i loro oggetti Objective-C ricevono un riferimento forte in modo che non abbandonino l'ambito prima dell'esecuzione del blocco.