2012-11-14 14 views
7

Pracuję nad projektem, który został pierwotnie zbudowany w XCode 4.0, a następnie został zmigrowany do XCode 4.2. Teraz mam przetestowane migracji do XCode 4.5, a ja dostaję mnóstwo ostrzeżeń jak poniżej ...Kod XCode 4.5 ostrzega o konfliktach nazw metod między kategoriami dla klas nadrzędnych/potomnych

instance method 'values' in category from <pathToTheFile>/HistoryObject+extras.o conflicts with same method from another category 

Te ostrzeżenia nigdy nie pojawiły się w poprzednich wersjach XCode, a kod nie został zmieniony.

Projekt jest ustawiony na iOS 4.3 dla celu wdrożenia.

Mamy więc od poprzedniego autora kilka klas typów DAO, które moim zdaniem zostały wygenerowane automatycznie z CoreData, a następnie każda z tych klas ma kategorię, która rozszerza ją o wdrożenie pewnych metod. Podam przykład ...

Mamy klasę podstawową o nazwie LisaObject, która dziedziczy z NSManagedObject, i ma kategorię o nazwie LisaObject + dodatki. W LisaObject + dodatki istnieje metoda o nazwie "values", która zwraca NSMutableDictionary.

Następnie mamy klasę o nazwie HistoryObject, która dziedziczy po LisaObject. Istnieje również Kategoria dla obiektu HistoryObject o nazwie HistroyObject + dodatki. Ta kategoria ma również metodę o nazwie "wartości". W metodzie ValueObject + extras values ​​wywołuje [super wartości], a następnie sprawdza pewne warunki i ustawia dodatkowe wartości w słowniku, które nie są ustawione w metodzie klasy podstawowej.

Mamy wtedy klasę o nazwie LessonStatusObject, która dziedziczy z obiektu HistoryObject, a także ma kategorię o nazwie LessonStatusObject + dodatki, która ma metodę o nazwie wartości. Ta metoda wartości wywołuje również [super wartości], a następnie wykonuje dodatkowe prace nad zwróconym słownikiem.

Dla każdej z tych metod "wartości", otrzymujemy ostrzeżenie w czasie kompilacji, takie jak pokazane powyżej, gdzie jest napisane, że kategoria ma metodę o sprzecznej nazwie.

Mam kilka pytań na ten temat.

Po pierwsze, czy to wdrożenie może spowodować jakiekolwiek uzasadnione problemy, czy te ostrzeżenia są ogólnie łagodne? Próbowałem zastanowić się, w jaki sposób ta implementacja może spowodować niejednoznaczność w czasie wykonywania, ale nie widzę, jak to się mogło stać.

Po drugie, czy jest coś, co powinienem zrobić, aby naprawić te ostrzeżenia (i nie chodzi mi tylko o to, żeby przestały się pojawiać, mam na myśli naprawę przyczyny)? Czy jest jakiś inny sposób, w jaki powinniśmy tego dokonać?

Ponadto, dlaczego XCode 4.2 nie ostrzegałby o tym, ale XCode 4.5 ostrzega?

Czy nie rozumiem czegoś o kategoriach? Chodzi mi o to, że jeśli metoda "wartości" byłaby faktycznie częścią implementacji każdej klasy, nie byłoby problemu z zastąpieniem ich tak, jak robimy, ale kompilator wydaje się narzekać tylko dlatego, że są to Kategorie. Czy jest w tym coś niebezpiecznego?

Każda rada jest doceniana.

EDIT: Wystarczy, aby dostarczyć więcej informacji ... Kiedy byliśmy przy użyciu XCode 4.2, projekt miał kompilatora LLVM zestaw do Apple Compiler 3.0. Teraz, kiedy otwieram projekt w XCode 4.5, ma on kompilator ustawiony na Apple LLVM Compiler 4.1.

+0

Proszę się nauczyć odróżniać IDE (Xcode) od kompilatora (Clang, zakładam). Kompilator podaje ci ostrzeżenia, a nie Xcode. Xcode to tylko frontowy koniec. –

Odpowiedz

4

Nie ignoruj ​​ostrzeżenia.

„Programowanie w Objective-C” Apple przewodniku, w sekcji „Customizing Existing Classes”, mówi:

Jeśli nazwa metody zadeklarowanej w kategorii jest taka sama jak metoda w oryginalnej klasy lub metoda w innej kategorii na tej samej klasie (lub nawet nadklasie), zachowanie nie jest zdefiniowane, która implementacja metody jest używana w czasie wykonywania.

Jeśli to działało dla Ciebie, to jest szczęście.

+0

Rozumiem, jak mogłaby istnieć dwuznaczność z dwiema kategoriami tej samej klasy, które obie mają tę samą nazwę metody. Nie widzę jednak, jak mogłaby istnieć dwuznaczność, gdy nadklasa i podklasa mają dwie różne kategorie o metodach o tej samej nazwie. Jak to się różni od przesłonięcia metody zwykłej instancji? Czy możesz wyjaśnić, czy istnieje różnica między kategoriami, które mogą powodować dwuznaczność? – Jim

+0

Nie wiem dokładnie, dlaczego zachowanie jest niezdefiniowane, dlatego odradzam dokumentację Apple'a. Na pewno chciałbym wiedzieć, dlaczego sam. –

+0

Dzięki za odpowiedź. Nadal chciałbym wiedzieć, czy konieczne jest wprowadzenie poważnych zmian, aby naprawić wszystkie te ostrzeżenia, jeśli naprawdę nie może być żadnego sposobu, aby spowodować uzasadnioną niejednoznaczność w czasie wykonywania. Oczywiste jest, dlaczego dwie kategorie na tej samej klasie o tych samych nazwach metod spowodowałyby niejasności, ale nie ma sensu, dlaczego dwie kategorie na dwóch różnych klasach, które są rodzicem/dzieckiem, mogłyby kiedykolwiek wywołać niejednoznaczność. To po prostu nie ma sensu; każda klasa ma swój własny zestaw metod, a dziecko powinno zastąpić rodzica, jeśli jest tak samo nazwane. W jaki sposób zmienia się to za pomocą kategorii? – Jim

28

Miałem ten sam denerwujący problem i okazało się, że przypadkowo włączyłem plik .m tej kategorii zamiast pliku .h w jednym z moich kodów VC. Skorygowanie go do pliku .h usunęło ostrzeżenia łącznika.

+0

Dziękuję za sugestię, sprawdzę to, aby upewnić się, że to nie problem. – Jim

+6

To też mi się przydarzyło. Proponuję każdemu, kto widzi, że to przeszukuje cały projekt dla ciągu znaków ".m". –

0

Miałem również ten problem, ale został spowodowany przez coś innego. Dla mnie ta kategoria została dwukrotnie dodana do projektu Xcode! Nie odkryłem, że tak było, dopóki nie poszedłem zmienić nazwy jednej z metod i zobaczyłem w podsumowaniu refaktoryzacji, że dwukrotnie umieściło plik kategorii.

Powiązane problemy