Eine Klasse ohne Init-Methode erstellen (Objective-c)

8

Ist es möglich, eine Klasse ohne Init-Methode zu erstellen, um alle Aufrufer zu zwingen, das Objekt stattdessen mit einer Factory-Methode zu erstellen?

    
Casebash 02.02.2010, 23:12
quelle

5 Antworten

5

Sie wollen also im Grunde sicherstellen, dass Ihre Klasse niemals mit -init initialisiert wird, oder? Sie können genau nicht tun, was Sie tun möchten, aber Sie können näher kommen.

Da Sie von NSObject erben, haben Sie eine init-Methode, und Sie können nichts tun, um zu verhindern, dass sie aufgerufen wird. Das heißt, Sie könnten init dies überschreiben:

%Vor%

Auf diese Weise tötet jemand, der Ihre -init-Methode aufruft, das Objekt, also ist Ihre init-Methode praktisch nicht aufrufbar.

    
Saurabh Sharan 02.02.2010, 23:48
quelle
4

Wenn Sie wirklich möchten, dass Benutzer Ihrer Klasse, die init verwenden, Probleme verursachen möchten, können Sie Folgendes tun:

%Vor%

Sie rufen super 's doesNotRecognizeSelector: auf, weil Sie möglicherweise Ihr eigenes Verhalten für nicht erkannte Selektoren für Ihre Klasse implementieren möchten.

    
dreamlax 02.02.2010 23:41
quelle
1

Hängt davon ab. Wenn Sie Ihre Klasse von NSObject erben, wird die vererbte init -Methode verwendet (die nichts mit Ihren Instanzvariablen zu tun hat). In diesem Sinne, selbst wenn Sie wirklich keine init -Methode haben wollten, würden Sie höchstwahrscheinlich noch eine haben. Wenn Ihre Frage also lautet: "Muss ich eine triviale init -Methode implementieren?" Lautet die Antwort "Nein, Sie müssen nicht". Wenn Ihre Frage jedoch lautet: "Muss ich die init -Methode aufrufen, wenn ich sie nicht überschrieben habe?", Lautet die Antwort "Ja, Sie tun". Was auch immer Sie mit NSObject-Unterklassen tun, Sie müssen irgendwann init aufrufen, nachdem das Objekt erstellt wurde. So ist die Art zu leben.

Das heißt, Sie am wahrscheinlichsten wollen eine init -Methode, es sei denn, Ihre Objektinitialisierung erfordert nichts mehr als das Nullen Ihres gesamten Objekts.

Andernfalls, wenn Sie nicht von NSObject oder einer seiner Unterklassen erben und nur von nichts erben, was eindeutig eine schlechte Idee ist, weil die NSObject -Klasse mit allem umgeht die ObjC-Laufzeit muss tun und die Anforderungen sind ziemlich hoch, dann werden Sie möglicherweise am Ende keine init Methode überhaupt . Aber ernsthaft, versuche das nicht zu Hause.

    
zneak 02.02.2010 23:22
quelle
0

Sicher. In Objective-C gibt es keine tatsächlichen -Konstruktoren . init -Typ-Methoden werden normalerweise verwendet, um eine Klasse zu initialisieren, ähnlich wie ein Konstruktor, aber sie sind nur eine "normale" Methode (es gibt nichts Besonderes an ihnen, wie es zB bei Java-Konstruktoren der Fall ist) / p>

Wenn Ihre Klasse die no Initialisierung für ihre Instanzen nicht ausführt, möchten Sie wahrscheinlich eine Art init -Methode haben.

    
mipadi 02.02.2010 23:17
quelle
0

NSObject implementiert eine init -Methode für Sie, die alles tut, was sie tut. Wenn Ihre Klasse bei der Instanziierung nichts einzurichten hat, überschreiben Sie einfach nicht die Methode -(id)init , die von NSObject bereitgestellt wird. Aber Sie rufen es immer noch auf, wenn Sie die Instanz erstellen.

    
Alex Wayne 02.02.2010 23:21
quelle

Tags und Links