/ / NSDictionary + ARC + kópia vs referencia - Objective-c, ios

NSDictionary + ARC + kópia verzus referencia - objektív-c, ios

Toto sú pravdepodobne veľmi jednoduché otázky typu ÁNO | NIE.

Mám nejaké slovníky NSD, ktoré obsahujú iné slovníky NSD. Povedzme NSDictionary_A a NSDictionary_B. Tieto pretrvávajú počas životnosti aplikácie.

Slovníky NSD obsiahnuté v NSDictionary_A sa odovzdávajú odkazom na rôzne objekty:

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

Neskôr sa to zmení:

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

Takže prvá otázka: Na @property nástroj je syntetizovaný + zachovaný ako strong tak aj setr pre instrumentnastaviť aktuálnu hodnotu instrument na nil pred nastavením novej hodnoty, a ak áno, ovplyvní to zdroj referencie NSDictionary_A - inými slovami, nastavte odkaz na nil"? Znie to zle, len to napísať... takže si myslím, že odpoveď je NO tu. Tiež pravdepodobne nezáleží na tom, že @property nástroj je uložený ako weak alebo strong od referencie v NSDictionary_A1 pretrváva počas životnosti aplikácie, ale keďže je to ukazovateľ, mal by byť weak - ÁNO?

Druhá otázka: Slovník NSD v NSDictionary_B sa odovzdá objektu, ale môže zmeniť niektoré hodnoty v tomto slovníku NSD:

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

Takže by som mal robiť a copy slovníka NSD tu, pretože jeho hodnoty sa zmenia, alebo úplne zle rozumiem celej tejto referencii?

odpovede:

1 pre odpoveď č. 1

Zamieňate sa v tom, ako fungujú ukazovatele.

Pri prvej otázke je „track.instrument“ len ukazovateľ. Takže to začne ako "ukazovanie na nulu".

toto:

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

znamená „prestať ukazovať na nulu a ukázať na tento objekt“

Ak môžete zabezpečiť, že váš slovník zostane zachovanýpre celú aplikáciu potom nezáleží na tom, čo je na @modrom kľúči, sa nikdy nerozdelí. Ale kvôli správnemu kódu by mal byť slabý.

Edit: Nesprávne som si prečítal druhú otázku.

Druhá otázka:

o tom:

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

najprv váš ukazovateľ ukazuje na NSDictionary zo slovníka.

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

Keďže ide o slovník NSD, toto nie je platné. NSDictionaries nemôžete zmeniť, pretože sú nemenné, MAL by to byť NSMutableDictionary.

Ak však nemáte záujem vrátiť upravenú verziu späť do pôvodného slovníka, môžete ju skopírovať, ale najskôr ako NSMutableDictionary a potom zmeniť.

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

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

VEĽMI DÔLEŽITÉ: Keďže vytvárate „nový“ slovník. track.playbackType musí byť silný, inak sa jednoducho okamžite uvoľní po skončení funkcie a mutableDict dostane mimo rozsah.


0 pre odpoveď č. 2

Referencie sú len ukazovatele, pričom jedna je nastavená na nulunebude mať žiadny účinok okrem nasledujúceho prípadu: Je to posledná silná referencia a ďalšie slabé referencie stále existujú. V takom prípade budú všetky slabé referencie nulové. Silné vlastnosti nastavia starú hodnotu na nulu, v skutočnosti sa odošle výzva na uvoľnenie, ale to ovplyvní REFERENCIU, nie OBSAH referencie.

Čo sa týka druhej otázky, je dosť mätúca a potrebujem viac info o playbackType. Hovoríte, že je to slovník NSD, ale slovník NSD túto vlastnosť nemá maxRange takže to musí byť typ, ktorý ste definovali. Nemôžete zmeniť ani hodnoty slovníka NSD, pretože je nemenný.

Ale tu je všeobecná odpoveď:Ak prejdete ukazovateľom na premenlivý objekt ako silný (alebo dokonca slabý), budete môcť zmeniť obsah originálu. Ak odošlete ukazovateľ na meniteľný objekt ako kópiu, získate nový objekt, ktorý neovplyvní originál.