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 instrument
impostare 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
- SÌ?
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 № 1Ti 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.