/ / NSDictionary + ARC + kopia vs referencja - cel-c, ios

NSDictionary + ARC + copy a referencja - target-c, ios

Są to prawdopodobnie dość proste pytania typu TAK|NIE.

Mam kilka NSDictionaries zawierających inne NSDictionaries. Powiedzmy NSDictionary_A i NSDictionary_B. Pozostają one przez cały okres użytkowania aplikacji.

Słowniki NSD zawarte w NSDictionary_A są przekazywane przez referencję do różnych obiektów:

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

Później to się zmienia:

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

Więc pierwsze pytanie: The @property instrument jest zsyntetyzowany + zachowany jako strong tak samo seter dla instrumentustaw aktualną wartość instrument do nil przed ustawieniem nowej wartości, a jeśli tak, czy ma to wpływ na źródło odniesienia w NSDictionary_A - innymi słowy, ustaw odniesienie do nil"? Brzmi źle po prostu pisząc to ... więc myślę, że odpowiedź brzmi NIE tutaj. Poza tym prawdopodobnie nie ma znaczenia, że @property instrument jest przechowywany jako weak lub strong od odniesienia w NSDictionary_A1 utrzymuje się przez całe życie aplikacji, ale ponieważ jest to wskaźnik, powinno być weak - TAK?

Drugie Pytanie: NSDsłownik w NSDictionary_B jest przekazywany do obiektu, ale może zmienić niektóre wartości w tym NSDictionary:

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

Więc czy powinienem robić copy NSDictionary tutaj, ponieważ jego wartości zostaną zmienione, czy też kompletnie nie rozumiem tego całego przekazu odniesienia?

Odpowiedzi:

1 dla odpowiedzi № 1

Mylisz się w sposobie działania wskaźników.

W przypadku pierwszego pytania „track.instrument” to tylko wskazówka. Zacznie się więc jako „wskazując na zero”.

to:

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

oznacza „przestań wskazywać na zero i wskaż ten obiekt”

Jeśli możesz upewnić się, że Twój słownik będzie się utrzymywałdla całej aplikacji nie ma to znaczenia, cokolwiek znajduje się w klawiszu @blue, nigdy nie zostanie cofnięte. Ale ze względu na poprawny kod powinien być słaby.

Edycja: Niepoprawnie przeczytałem drugie pytanie.

Drugie Pytanie:

o tym:

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

najpierw twój wskaźnik wskazuje na NSDictionary ze słownika.

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

Ponieważ jest to słownik NSD, nie jest to prawidłowe. Nie możesz zmienić NSDictionary, ponieważ są niezmienne, POWINNO to być NSMutableDictionary.

JEDNAK, jeśli nie jesteś zainteresowany wstawianiem zmodyfikowanej wersji do oryginalnego słownika, możesz go skopiować, ale najpierw jako NSMutableDictionary, a następnie zmienić.

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

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

BARDZO WAŻNE: Ponieważ tworzysz „nowy” słownik. track.playbackType musi być silny, w przeciwnym razie zostanie natychmiast zdeaktywowany po zakończeniu funkcji i mutableDict wymyka się z zakresu.


0 dla odpowiedzi nr 2

Referencje to tylko wskazówki, ustawiając jeden na zeronie przyniesie żadnego efektu, z wyjątkiem następującego przypadku: Jest to ostatnie silne odniesienie, a inne słabe odniesienia nadal istnieją. W takim przypadku wszystkie słabe referencje staną się zerowe. Silne właściwości ustawią starą wartość na zero, w efekcie wysyłając wezwanie do zwolnienia, ale ma to wpływ na REFERENCE, a nie na TREŚĆ referencji.

Jeśli chodzi o drugie pytanie, to jest dość mylące i potrzebuję więcej informacji info playbackType. Mówisz, że to NSDictionary, ale NSDictionary nie ma właściwości maxRange więc musi to być zdefiniowany przez Ciebie typ. Nie możesz też zmienić wartości NSDictionary, ponieważ jest on niezmienny.

Ale oto ogólna odpowiedź:Jeśli przekażesz wskaźnik do obiektu mutowalnego jako silnego (lub nawet słabego), będziesz mógł zmienić zawartość oryginału. Jeśli przekażesz wskaźnik do mutowalnego obiektu jako kopię, otrzymasz nowy obiekt, który nie wpływa na oryginał.