Muszę głęboko skopiować niestandardowy obiekt, który ma własne obiekty. Czytałem i jestem trochę zdezorientowany, jak dziedziczyć NSCopying i jak używać NSCopyObject.
objective-c
copy
ben
źródło
źródło
Odpowiedzi:
Jak zawsze w przypadku typów referencyjnych, istnieją dwa pojęcia „kopiowania”. Jestem pewien, że je znasz, ale dla kompletności.
Chcesz tego drugiego. Jeśli jest to jeden z twoich własnych obiektów, wystarczy zaadoptować protokół NSCopying i zaimplementować strefę - (id) copyWithZone: (NSZone *). Możesz robić, co chcesz; chociaż chodzi o to, żeby zrobić prawdziwą kopię siebie i zwrócić ją. Wywołujesz copyWithZone na wszystkich swoich polach, aby utworzyć dokładną kopię. Prosty przykład to
źródło
autorelease
, czy czegoś mi brakuje?copyWithZone:
spełnia te kryteria, dlatego musi zwrócić obiekt z liczbą zachowań +1.alloc
zamiast odallocWithZone:
czasu przekazania strefy?allocWithZone
.copy
,mutableCopy
icopyWithZone
, połączonych w jedną z odpowiedzi, jest tutaj.Dokumentacja Apple mówi
dodać do istniejącej odpowiedzi
źródło
No visible @interface for 'NSObject' declares the selector 'copyWithZone:'
. Wydaje mi się, że jest to wymagane tylko wtedy, gdy dziedziczymy z innej klasy niestandardowej, która implementujecopyWithZone
Nie znam różnicy między tym kodem a moim, ale mam problemy z tym rozwiązaniem, więc przeczytałem trochę więcej i stwierdziłem, że musimy ustawić obiekt przed jego zwróceniem. Mam na myśli coś takiego:
Dodałem tę odpowiedź, ponieważ mam wiele problemów z tym problemem i nie mam pojęcia, dlaczego tak się dzieje. Nie znam różnicy, ale działa na mnie i może przyda się też innym :)
źródło
Myślę, że ta linia powoduje wyciek pamięci, ponieważ dostęp do niej uzyskuje się
obj
poprzez właściwość, która jest (zakładam) zadeklarowana jakoretain
. Tak więc liczba zatrzymań zostanie zwiększona o własność icopyWithZone
.Uważam, że powinno to być:
lub:
źródło
Istnieje również użycie operatora -> do kopiowania. Na przykład:
Rozumowanie jest takie, że wynikowy skopiowany obiekt powinien odzwierciedlać stan oryginalnego obiektu. „.” Operator mógłby wprowadzić efekty uboczne, ponieważ wywołuje metody pobierające, które z kolei mogą zawierać logikę.
źródło