Frage

Es gibt ein paar Dinge über objektives C, die für mich verwirrend sind:

Erstens in der Objektiv-C-Anleitung, Es ist sehr klar, dass jede Klasse die Init -Methode ihrer Unterklasse aufrufen muss. Es ist ein bisschen unklar, ob eine Klasse, die direkt von NSObject erbt oder nicht init Methode. Ist das der Fall? Und wenn ja, warum ist das so?

Zweitens gibt es im Abschnitt über NSObject diese Warnung:

Eine Klasse, die kein besonderes Verhalten einer anderen Klasse erben muss, sollte dennoch eine Unterklasse der NSObject -Klasse erstellen. Instanzen der Klasse müssen zumindest die Fähigkeit haben, sich zur Laufzeit wie Objective-C-Objekte zu verhalten. Das Erben dieser Fähigkeit aus der NSObject -Klasse ist viel einfacher und zuverlässiger, als sie in einer neuen Klassendefinition neu zu erfinden.

Bedeutet dies, dass ich angeben muss, dass alle Objekte explizit von NSObject erben? Oder ist das wie Java/Python/C#, in dem alle Klassen Subtypen des NSObject sind? Wenn nicht, gibt es einen Grund, eine andere Wurzelklasse als NSObject zu erstellen?

War es hilfreich?

Lösung

1) Jedes Mal, wenn ein Objekt in Objective-C zugeordnet wird, wird sein Speicher ausgesetzt und muss durch einen Aufruf an initialisiert werden init. Unterklassen von NSObject kann ihre eigene spezialisierte haben init Routinen, und zu Beginn einer solchen sollten sie ihre Superklasse nennen ' init Routine so etwas wie SO:

self = [super init];

Die Idee ist das alles init Routinen rasen schließlich bis zu NSObject's init.

2) Sie müssen sich explizit über das Erbe einsetzen:

@instance myClass : NSObject { /*...*/ } @end

Es gibt keinen Grund, eine andere Wurzelklasse zu haben, als NSObject -Viel Ziel-C ist stark von dieser Klasse angewiesen. Wenn Sie also versuchen, zu umgehen, führt Sie dazu, dass Sie sich unnötig in den Fuß schießen.

Andere Tipps

Da es möglich ist, aus verschiedenen Root -Basis -Klassen zu erben, müssen Sie Sie ausdrücklich aus dem NSObject deklarieren, wenn Sie eine neue Klasse erstellen (es sei denn natürlich, Sie unterklassigen etwas anderes, was wiederum wahrscheinlich NSObject subkennt).

Fast nie gibt es die Notwendigkeit, Ihre eigene Basisklasse zu erstellen, und es wäre auch nicht einfach, dies zu tun.

Objective-C kann mehrere Wurzelklassen haben, daher müssen Sie sich ausdrücklich über die Vererbung befassen. Iirc NSPROXY ist eine andere Wurzelklasse. Sie werden wahrscheinlich niemals Ihre eigene Root -Klasse erstellen oder müssen, aber sie existieren.

Wenn Sie den Init von NSObject aufrufen, ist es Teil der Sonder- und Teilsicherheit. Der Init von NSObject kann jetzt möglicherweise nichts bewirken. Dies ist keine Garantie dafür, dass sich zukünftiges Verhalten nicht ändert. Rufen Sie init an, um sicher zu sein.

Sie müssen [Super init] anrufen, da ein Code für die Initialisierung vorhanden ist, dass Sie nicht schreiben müssen, da er in NSObjects Init für Sie geschrieben ist, wie wahrscheinlich die tatsächliche Speicherzuweisung usw.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top