2012-02-14 15 views
8

Jestem zdezorientowany patrząc na dokumentację Apple i czytając wzorce projektowe kakao. W dokumentacji firmy Apple dla copyWithZone:, czyta:Zastąp kopię lub copyWithZone: lub obie?

Ta metoda istnieje więc obiekty klasy mogą być używane w sytuacjach, gdy trzeba obiektu zgodnego z protokołem NSCopying. W przypadku przykładu ta metoda umożliwia użycie obiektu klasy jako klucza do obiektu NSDictionary o numerze . Nie należy przesłonić tej metody.

Dla copy czyta:

Jest to metoda wygoda dla klas, które przyjęły protokół NSCopying . Wyjątek jest podniesiony, jeśli nie ma implementacji dla copyWithZone :.

NSObject sam nie obsługuje protokołu NSCopying. Podklasy muszą obsługiwać protokół i implementować metodę copyWithZone :. Wersja podklasy metody copyWithZone: powinna najpierw wysłać wiadomość , aby włączyć jej implementację, chyba że podklasa pochodzi bezpośrednio z NSObject.

W przykładach w Patterns Cocoa Design, one przesłonić copyWithZone: i mutableCopyWithZone: ale nie zastępują copy gdy zgodny z protokołem NSCopying. Czy to powinienem zrobić, jeśli chcę użyć mojej niestandardowej podklasy w kluczu NSDictionary? Czy mogę zastąpić copy?

Podobnie, jeśli wykonam [myClass copy], czy to wywołanie copyWithZone: lub copy dla tej niestandardowej podklasy? Dzięki.

Odpowiedz

14

To całkiem proste: domyślna implementacja copy po prostu wywołuje copyWithZone: z argumentem NULL. Dlatego zawsze należy wdrożyć copyWithZone:. Ponieważ jednak strefy pamięci nie są używane (o ile mi wiadomo) w systemie iOS, należy zignorować tę strefę bez jakichkolwiek założeń.

Edit: opracowanie, ty może wdrożyć copy jak dobrze, ale musi wdrożyć copyWithZone: bo nigdy nie wiadomo, które z nich NSDictionary zadzwoni w iOS 6.

0

Można nadal używać nadklasę wygodę metoda taka, jaka jest, ponieważ w żadnym wypadku nie wywołuje ona nic innego, jak wywołanie copyWithZone:.

To powinno być prawdziwe dla dowolnej metody wygody. Powinieneś dowiedzieć się, jaką metodę nazywają i zastąpić to.

Ponadto, jak wspomniano powyżej, strefy nie są już w ogóle używane, ale metoda nadal ma ten parametr ze względu na zgodność i przyczyny historyczne.