2009-08-25 8 views
4

Es gibt ein paar Dinge, über Objective-C, die mir sind verwirrend:Wie funktioniert das Erben von NSObject?

Zum einen in der objective-c guide, es ist sehr klar, dass jede Klasse die Methode init seiner Unterklasse aufrufen muss. Es ist ein wenig unklar, ob eine Klasse, die direkt von NSObject erbt, ihre init-Methode aufrufen muss. Ist das der Fall? Und wenn ja, warum?

Zweitens im Abschnitt über NSObject, gibt es diese Warnung:

Eine Klasse, die kein spezielles Verhalten von einer anderen Klasse zu erben braucht sollte dennoch eine Unterklasse der Klasse NSObject gemacht werden. Instanzen der Klasse müssen mindestens die Fähigkeit haben, sich zur Laufzeit wie Objective-C-Objekte zu verhalten. Die Übernahme dieser Fähigkeit aus der NSObject-Klasse ist viel einfacher und viel 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#, wo alle Klassen Untertypen von NSObject sind? Falls nicht, gibt es einen Grund, eine andere Root-Klasse als NSObject zu erstellen?

Antwort

6

1) Jedes Mal, wenn ein Objekt in Objective-C zugewiesen wird, wird sein Speicher auf Null gesetzt und muss durch einen Aufruf von init initialisiert werden. Subklassen von NSObject können ihre eigenen spezialisierten init Routinen haben, und am Anfang eines solchen sollten sie ihre Superklasse nennen init Routine etwas wie so: Sein

self = [super init]; 

Die Idee, dass alle init Routinen rieseln bis schließlich zu NSObject ‚s init.

2) Sie müssen sich über die Vererbung explizit sein:

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

Es gibt keinen Grund ist eine Wurzelklasse anders als NSObject zu haben - viel Objective-C stützt sich stark auf diese Klasse, so versuchen, Um es zu umgehen, werden Sie sich unnötig in den Fuß schießen.

+1

Wie in anderen Posts angemerkt wurde, gibt es manchmal einen Grund, eine andere Root-Klasse als NSObject zu haben. Cocoa enthält die zusätzliche Stammklasse NSProxy, die die Vorteile von NSObject als explizite und nicht als implizite Vererbung darstellt. Es ist richtig, dass es sehr unwahrscheinlich ist, dass ein Drittentwickler eine neue Root-Klasse erstellen sollte. –

+0

+1 Danke, dass Sie mich gerade halten. – fbrereto

0

Sie müssen [super init] nennen, weil es Code ist hinter der Initialisierung, dass Sie schreiben nicht, weil es für Sie in NSObjects init, wie wahrscheinlich tatsächliche Speicherzuweisung usw.

+1

Tidbit: Einige Cocoa-Klassen erben tatsächlich von 'NSProxy', einer anderen Root-Klasse im Cocoa-Framework. Sowohl "NSObject" als auch "NSProxy" implementieren das "NSObject" -Protokoll. – mipadi

2

geschrieben Da es möglich ist, Um von verschiedenen Root-Basisklassen zu erben, müssen Sie explizit deklarieren, dass Sie von NSObject erben, wenn Sie eine neue Klasse erstellen (es sei denn, Sie bilden bereits eine andere Klasse ab, die wiederum wahrscheinlich NSObject subclassiert).

Fast nie ist es notwendig, eine eigene Basisklasse zu erstellen, und das wäre auch nicht einfach.

1

Objective-C kann mehrere Stammklassen haben, daher müssen Sie explizit die Vererbung angeben. IIRC NSProxy ist eine andere Stammklasse. Sie werden wahrscheinlich nie eine eigene Root-Klasse erstellen wollen oder müssen, aber sie existieren.

Wie zum Aufrufen NSObjects init, es ist Teil benutzerdefinierte und Teil Sicherheit. NSObjects init kann jetzt nichts tun, das ist keine Garantie, dass sich zukünftiges Verhalten nicht ändern wird. Rufen Sie init auf, um sicher zu sein.

Verwandte Themen