Ich arbeite an einem Projekt, das ursprünglich in XCode 4.0 erstellt wurde und dann zur Verwendung von XCode 4.2 migriert wurde. Jetzt habe ich die Migration auf XCode 4.5 getestet und bekomme eine Menge Warnungen wie unten ...
%Vor%Diese Warnungen wurden in früheren Versionen von XCode nie angezeigt, und der Code wurde nicht geändert.
Das Projekt ist für das Einsatzziel auf iOS 4.3 eingestellt.
Wir haben also von einem früheren Entwickler eine Reihe von Klassen vom Typ DAO, von denen ich glaube, dass sie automatisch aus CoreData generiert wurden, und dann hat jede dieser Klassen eine Kategorie, die sie erweitert, um bestimmte Methoden zu implementieren. Ich gebe ein Beispiel ...
Wir haben eine Basisklasse namens LisaObject, die von NSManagedObject erbt und eine Kategorie namens LisaObject + extras hat. In LisaObject + Extras gibt es eine Methode namens "values", die ein NSMutableDictionary zurückgibt.
Wir haben dann eine Klasse namens HistoryObject, die von LisaObject erbt. Es gibt auch eine Kategorie für HistoryObject mit dem Namen HistroyObject + extras. Diese Kategorie hat auch eine Methode namens "values". In der HistoryObject + extras values-Methode ruft es [super values] auf, prüft dann auf einige Bedingungen und legt einige zusätzliche Werte im Dictionary fest, die in der Basisklassenmethode nicht definiert sind.
Wir haben dann eine Klasse namens LessonStatusObject, die von HistoryObject erbt, und auch sie hat eine Kategorie namens LessonStatusObject + extras, die eine Methode namens values hat. Diese Werte-Methode ruft auch [Super-Werte] auf und führt dann einige zusätzliche Arbeiten am zurückgegebenen Wörterbuch durch.
Für jede dieser "values" -Methoden erhalten wir beim Kompilieren eine Warnung wie die oben gezeigte, in der steht, dass die Kategorie eine Methode mit einem widersprüchlichen Namen hat.
Ich habe ein paar Fragen dazu.
Erstens: Könnte diese Implementierung irgendwelche legitimen Probleme verursachen, oder sind diese Warnungen im Allgemeinen gutartig? Ich habe versucht, darüber nachzudenken, wie diese Implementierung eine Mehrdeutigkeit zur Laufzeit verursachen kann, aber ich sehe nicht, wie das passieren könnte.
Zweitens, gibt es etwas, was ich tun sollte, um diese Warnungen zu beheben (und ich meine nicht, dass sie aufhören aufzutreten; ich meine, die Ursache zu beheben)? Gibt es einen anderen Weg, wie wir das machen sollten?
Warum sollte XCode 4.2 auch nicht davor warnen, aber XCode 4.5 warnt?
Verstehe ich etwas über Kategorien falsch? Ich meine, wenn die "values" -Methode tatsächlich Teil jeder Klassenimplementierung wäre, wäre es kein Problem, sie so zu überschreiben, wie wir es tun, aber der Compiler scheint sich zu beschweren, einfach weil es sich um Kategorien handelt. Gibt es etwas unsicheres daran?
Jeder Rat wird sehr geschätzt.
BEARBEITEN: Nur um mehr Informationen zu geben ... Als wir XCode 4.2 benutzten, ließ der Compiler den Compiler auf Apple LLVM Compiler 3.0 setzen. Wenn ich nun das Projekt in XCode 4.5 öffne, wird der Compiler auf Apple LLVM Compiler 4.1 gesetzt.
Ignorieren Sie die Warnung nicht.
Apples "Programmieren mit Objective-C" Anleitung, in der " Anpassen bestehender Klassen "Abschnitt, sagt:
Wenn der Name einer in einer Kategorie deklarierten Methode mit einer Methode übereinstimmt in der ursprünglichen Klasse oder eine Methode in einer anderen Kategorie auf dem gleichen Klasse (oder sogar eine Oberklasse), das Verhalten ist undefiniert was Methodenimplementierung wird zur Laufzeit verwendet.
Wenn es für Sie funktioniert hat, dann ist es Glück.
Ich hatte dieses Problem auch, wurde aber durch etwas anderes verursacht. Für mich war es, dass die Kategorie zweimal zum Xcode-Projekt hinzugefügt wurde! Ich habe nicht erkannt, dass dies der Fall war, bis ich eine der Methoden umbenannt und in der Refactoring-Vorschau gesehen habe, dass die Kategoriedatei zweimal aufgelistet wurde.
Tags und Links objective-c ios xcode xcode4.5 categories