"Testen die Gleichheit der Klassen" in Objective-c
Ich habe ein problem, das Verständnis, das Teil des "Tests die Gleichheit der Klassen", die definiert ist in der apple-Anleitung.
In einem dynamisch erstellten Unterklasse, die Klasse Methode wird in der Regel überschrieben, so dass die Unterklasse tarnt sich als die Klasse, das es ersetzt. Beim Test für die Gleichheit der Klassen, daher sollten Sie vergleichen die Werte, die von der Methode der Klasse eher als diejenigen, die zurückgegeben werden, indem untere-level-Funktionen. Setzen in Bezug auf die API, die folgende Ungleichungen gelten für dynamische Unterklassen:
[object class] != object_getClass(object) != *((Class*)object)
Sollten Sie daher testen zwei Klassen für die Gleichstellung wie folgt:
if ([objectA class] == [objectB class]) { //...
- oder isMemberOfClass - stackoverflow.com/questions/383978/...
- Was ist dein Ziel hier? Testen Sie die Klasse eines Objekts, oder der Vergleich der Klassen der beiden Objekte, oder...? Sicherlich
*((Class *)object)
nicht gleich das Ergebnis der Verfahren für die erste Klasse-Objekt können Sie nicht nur gegossen, eine Instanz zu einer Klasse (auch, dieClass
- Typ ist bereits ein pointer). - sorry, ich vergaß zu erwähnen, seine von apple Führer, und ich bin nicht immer diese ganzen Tests die Gleichheit der Klassen Sache... das ganze para ist von apple guide...
- NÖ, das funktioniert. Wir haben
typedef struct { Class isa } *id;
so*((Class *)object)
perfekt gibt die isa (die Klasse) des Objekts. - Ich denke, Sie beantwortet Ihre eigene Frage. Wie die Leute wissen, fortgeschrittenen Zeug ist, indem Sie es den ganzen Tag, jeden Tag für Jahre und Jahre. Ich nehme an, ein Durst nach Verbesserung der eigenen Methoden und in der Lage sein, um ständig mehr zu erreichen mit weniger Aufwand tut nicht weh, entweder.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es Situationen, in denen Personen hinzufügen neuer Klassen zur Laufzeit. Ein Beispiel ist die Key-Value Observing: wenn Sie ein Objekt beobachten das Foundation framework erstellt eine neue Unterklasse des beobachteten Objekts Klasse. Diese Dynamik-Klasse verhält sich in der gleichen Weise wie Ihre Superklasse, fügt aber hinzu, KVO-Benachrichtigungen, um alle seine mutator-Methoden.
Die passage, die du zitiert hast, sagt, dass die Objective-C-Laufzeit kann sagen, dass diese neue Klasse abgesehen von der ursprünglichen Klasse. Jedoch, weil es nur ein Implementierungsdetail der Weg KVO ist gebaut, Sie sollte nicht wissen, oder kümmern uns um Sie. Die Entwickler daher überschrieb die
-class
Methode in Ihrer neuen Klasse, zu behaupten, dass Objekte waren noch Mitglieder der ursprünglichen Klasse.Wenn Sie prüfen wollen, ob zwei Objekte der gleichen Klasse, daher müssen Sie vergleichen die Ergebnisse Ihrer
-class
Methoden (die tricks wie KVO berücksichtigen), die anstelle der runtime-Funktionen.Hier ein Beispiel:
Sehen Sie, dass alles, was ich Tue ist die Schaffung von zwei Objekten, erzählt einer von Ihnen zu beobachten, die anderen, dann finden Sie heraus, was Ihre Klassen sind. Hier sind die Ergebnisse:
So, wie die Dokumentation schon sagt, es ist nur der erste Fall (vergleichen, wo wir
-class
), die alles tut, den code der Anwendung vernünftigerweise erwarten könnte. Die anderen beiden Möglichkeiten zu finden, aus der Klasse gefragt, die Laufzeit, und das umwandeln des Objekts Zeiger auf eineClass *
- beide zu verschenken Umsetzung details darüber, wie KVO hat sich die Klasse unter uns, und bedeutet, dass die Klasse den Vergleich jetzt nicht zeigen, dass die Klassen gleich sind.Weil die anderen Antworten und Kommentare beziehen sich auf
-isMemberOfClass:
und-isKindOfClass:
werde ich diese Punkte auch:-isKindOfClass:
ist nicht ein test für die Gleichheit der Klassen.[object isKindOfClass: aClass]
ist wahr, wennobject
ist eine Instanz vonaClass
oder einer Ihrer Unterklassen. Denn die passage, die Sie zitiert habe, ist über die Gleichheit der Klassen,-isKindOfClass:
ist hier nicht relevant. Das heißt, es ist sehr oft der test, den Sie übernehmen möchten in der Anwendung code. Es ist eher üblich, um sich über die Antwort auf die Frage "kann ich dieses Objekt verwenden, alsFoo
?" als "ist dieses Objekt eine Instanz genauFoo
?".-isMemberOfClass:
ist ein test für die Gleichheit der Klassen:[object isMemberOfClass: aClass]
ist nur wahr, falls object eine Instanz vonaClass
. Dieser test erfolgt mit dem Ergebnis der-class
Methode, was bedeutet, dass in diesem Beispielmodel
wird test positiv für[model isMemberOfClass: [NSObject class]]
.*(Class*)model
bevorzugt über*(model->isa)
?-class
nicht.Sollte es sein:
isKindOfClass:
nicht-test für die Gleichheit der Klassen, es tests, dass die getesteten Objekt ist ein Element der angegebenen Klasse oder jede Unterklasse.Vielleicht können, verwenden Sie die 'NSStringFromClass" - Methode und vergleichen Sie die erhaltenen strings durch 'isEqualToString' ?