Laut Apples Dokumentation:
Protokolle können nicht zum Eingeben von Klassenobjekten verwendet werden. Nur Instanzen können sein statisch in ein Protokoll eingegeben, so wie nur Instanzen statisch typisiert werden können zu einer Klasse. (Zur Laufzeit antworten jedoch beide Klassen und Instanzen auf a conformsToProtocol: Nachricht.)
Das stammt aus alter Dokumentation, aber es gibt nichts, was sagt, dass es sich seitdem geändert hat. Aber vorausgesetzt, es ist immer noch gültig, basierend darauf sollten Sie nicht tun, was Sie tun. Instanzen von NSString
können diesem Protokoll entsprechen, aber Sie sollten nicht sagen, dass das Objekt NSString
Class
dem entspricht.
Was die Ursache für den Fehler betrifft, glaube ich, dass dies darauf zurückzuführen ist, dass bei Angabe des Protokolls ein Fehler für Methoden gemeldet wird, die nicht in diesem Protokoll enthalten sind. Im folgenden Beispiel wird ein Fehler angezeigt:
%Vor% Aber Folgendes wird kompiliert (obwohl es eine Warnung gibt, dass class
eine Instanzmethode und keine Klassenmethode ist):
Sie werden auch feststellen, dass new
nicht im Protokoll NSObject
definiert ist, sondern nur in der Klasse NSObject
.
Wenn Sie also einfach Class
angeben, scheint der Compiler etwas Ähnliches zu tun, wenn Sie id
angeben, weil er den genauen Typ nicht kennt, so dass Sie Methoden von jedem bekannten Typ aufrufen können. Aber wenn Sie das Protokoll hinzufügen, können Sie nur Methoden aus diesem Protokoll aufrufen.
Wenn Sie sicherstellen möchten, dass alles, was Sie bah
zuweisen, mit einem bestimmten Protokoll übereinstimmt, während Sie nur Class
verwenden, können Sie Folgendes verwenden:
Class<NSSecureCoding>
ist ein Objekt, das auf die Klassenmethoden des Protokolls NSSecureCoding
reagiert. Das Protokoll NSSecureCoding
deklariert die Methode +new
nicht, sodass Sie es nicht aufrufen können.
Tags und Links objective-c objective-c-runtime