Ich versuche, NSNotification
zu unterklassen.
Apples Dokumente für NSNotification
geben Folgendes an:
NSNotification
ist ein Klassencluster ohne Instanzvariablen. So wie, Sie müssen die KlasseNSNotification
ableiten und die primitiven Methoden überschreibenname
,object
unduserInfo
. Sie können einen beliebigen Initialisierer auswählen Sie mögen, aber seien Sie sicher, dass Ihr Initialisierer nicht anruftNSNotification
Implementierung voninit
(via[super init]
).NSNotification
soll nicht direkt instanziiert werden und seininit
Methode löst eine Ausnahme aus.
Aber das ist mir nicht klar. Soll ich einen Initialisierer wie diesen erstellen?
%Vor% Die Unterklasse NSNotification
ist eine atypische Operation. Ich glaube, ich habe es in den letzten Jahren nur ein oder zwei Mal gesehen.
Wenn Sie die Informationen mit der Benachrichtigung weiterleiten möchten, ist dies die Eigenschaft userInfo
. Wenn Sie nicht gerne direkt über userInfo
auf Objekte zugreifen, können Sie eine Kategorie verwenden, um den Zugriff zu vereinfachen:
Sie können diesen Ansatz auch verwenden, um die Erstellung von NSNotification
zu vereinfachen. Ihre Kategorie könnte beispielsweise auch Folgendes enthalten:
Wenn aus irgendeinem Grund die Eigenschaften veränderbar sein müssen, müssen Sie Assoziative Referenzen , um dies zu erreichen:
%Vor%Es scheint, dass das funktioniert. Zum Beispiel:
%Vor%hüte dich auch vor einem massiven Gotcha, der sich auf NSNotifications bezieht. Der Typ von NSNotifications, der mit NSNotification notificationWithName: object: angegeben wurde, ist NSConcreteNotification, nicht NSNotification. Und um es ein bisschen schwieriger zu machen, wenn Sie nach einer Klasse suchen, NSConcreteNotification ist privat, Sie haben also nichts zu vergleichen.
Sie legen es nicht genau fest - Sie überschreiben einfach die Implementierung der name
-Methode, so dass sie zurückgibt, was Sie wollen. Mit anderen Worten:
Ihr Initialisierer sieht gut aus - ich habe kein Beispiel für init
gesehen, das die Implementierung der Superklasse nicht vorher aufgerufen hat, aber wenn das das ist, was das Dokument sagt, sollten Sie es versuchen.
Sie können ein userInfo
-Argument übergeben, wenn Sie eine Benachrichtigung senden. Warum nicht eine Payload erstellen und diese senden?
Fertig.
Als Nebenbemerkung: Ich habe im Laufe der Jahre herausgefunden, dass mein Code, der sich bewusst darum bemüht, Subklassen zu vermeiden, meinen Code sauberer, wartbarer, veränderbarer, testbarer und erweiterbarer gemacht hat. Wenn Sie das Problem mithilfe von Protokollen oder Kategorien lösen können, werden Sie sich nicht in das erste schäbige Design einklinken. Mit Swift 2.0-Protokollerweiterungen im Mix lachen wir auch wirklich.
Tags und Links objective-c inheritance cocoa nsnotification class-cluster