/ /NSDictionary + ARC + copia vs riferimento - obiettivo-c, ios

NSDictionary + ARC + copia vs riferimento - goal-c, ios

Queste sono probabilmente domande di tipo S|NO piuttosto semplici.

Ho alcuni NSDictionaries che contengono altri NSDictionaries. Diciamo NDictionary_A e NDictionary_B. Questi persistono per tutta la vita dell'app.

I NSDictionaries contenuti in NDictionary_A sono passati per riferimento a vari oggetti:

track.instrument = [NSDictionary_A objectForKey:@"Blue"];

Successivamente viene modificato:

track.instrument = [NSDictionary_A objectForKey:@"Red"];

Allora prima domanda: Il @property lo strumento è sintetizzato + mantenuto come strong così fa il setter per instrumentimpostare il valore corrente di instrument a nil prima di impostare il nuovo valore e, in caso affermativo, influisce sulla sorgente del riferimento in NSDictionary_A - in altre parole, impostare il riferimento su nil"? Sembra sbagliato scriverlo solo per iscritto .. quindi penso che la risposta sia NO Qui. Inoltre, probabilmente non importa che il @property lo strumento è memorizzato come weak o strong poiché il riferimento in reference NSDictionary_A1 persiste per la vita dell'app ma poiché è un puntatore, dovrebbe essere weak - ?

Seconda domanda: Un NDictionary in NDictionary_B viene passato a un oggetto ma può modificare alcuni dei valori in quel NSDictionary:

track.playbackType = [NSDictionary_B objectForKey:@"Random"]; [track.playbackType objectForKey:@"maxRange"] = 20;

Quindi dovrei fare un copy del NSDictionary qui perché i suoi valori verranno modificati o sto completamente fraintendendo questo intero riferimento che passa grazie?

risposte:

1 per risposta № 1

Ti stai confondendo sul modo in cui funzionano i puntatori.

Per la prima domanda, "track.instrument" è solo un puntatore. Quindi inizierà come "punta a zero".

Questo:

track.instrument = [NSDictionary_A objectForKey:@"Blue"];

significa "smetti di puntare a zero e punta a quell'oggetto"

Se puoi assicurarti che il tuo dizionario persistaper l'intera app, non importa, qualunque cosa si trovi nella chiave @blue non verrà mai deallocata. Ma per avere il codice corretto, dovrebbe essere debole.

Modifica: avevo letto la seconda domanda in modo errato.

Seconda domanda:

a questo proposito:

track.playbackType = [NSDictionary_B objectForKey:@"Random"];

prima il tuo puntatore punta al NSDictionary dal dizionario.

[track.playbackType objectForKey:@"maxRange"] = 20;

Poiché si tratta di un NSDictionary, questo non è valido. Non puoi cambiare NSDictionaries perché sono immutabili, DOVREBBE essere NSMutableDictionary.

TUTTAVIA, se non sei interessato a rimettere la versione modificata nel dizionario originale, puoi copiarla ma prima come NSMutableDictionary e poi cambiarla.

NSMutableDictionary *mutableDict = [[NSDictionary_B objectForKey:@"Random"] mutableCopy];

track.playbackType = mutableDict; //Note how track.playbackType has to be NSMutableDictionary aswell.

MOLTO IMPORTANTE: Dal momento che stai creando un "nuovo" dizionario. track.playbackType deve essere forte, o verrà semplicemente deallocato istantaneamente al termine della funzione e mutabileDict esce dall'ambito.


0 per risposta № 2

I riferimenti sono solo puntatori, impostando uno a zeronon avrà alcun effetto tranne nel caso seguente: È l'ultimo riferimento forte e esistono ancora altri riferimenti deboli. In tal caso tutti i riferimenti deboli diventeranno nulli. Le proprietà forti imposteranno il vecchio valore a zero, in effetti inviando una chiamata di rilascio ma ciò influisce sul RIFERIMENTO, non sul CONTENUTO del riferimento.

Per quanto riguarda la seconda domanda, è piuttosto confusa e ho bisogno di maggiori informazioni su playbackType. Dici che è un NSDictionary ma NSDictionary non ha la proprietà maxRange quindi deve essere un tipo che hai definito. Non è possibile modificare i valori di un NSDictionary perché è immutabile.

Ma ecco una risposta generica:Se passi un puntatore a un oggetto mutabile come forte (o anche debole) sarai in grado di cambiare il contenuto dell'originale. Se passi un puntatore a un oggetto mutabile come copia, otterrai un nuovo oggetto che non influirà sull'originale.