Objective-C leitet Ihr Objekt syntax von Smalltalk. Die gesamte Syntax für nicht objektorientierte Operationen (einschließlich primitiver Variablen, Vorverarbeitung, Ausdrücke, Funktionsdeklarationen und Funktionsaufrufe) ist identisch mit denen von C, während die Syntax für objektorientierte Funktionen eine Implementierung von Nachrichten im Smalltalk-Stil ist.

MessagesEdit

Das Objective-C-Modell der objektorientierten Programmierung basiert auf der Nachrichtenübergabe an Objektinstanzen. In Objective-C ruft man keine Methode auf; Man sendet eine Nachricht., Dies unterscheidet sich von dem von C++verwendeten Programmiermodell im Simulastil. Der Unterschied zwischen diesen beiden Konzepten besteht darin, wie der durch den Methoden-oder Nachrichtennamen referenzierte Code ausgeführt wird. In einer Sprache im Simulastil ist der Methodenname in den meisten Fällen vom Compiler an einen Codeabschnitt in der Zielklasse gebunden. In Smalltalk und Objective-C wird das Ziel einer Nachricht zur Laufzeit aufgelöst, wobei das empfangende Objekt selbst die Nachricht interpretiert., Eine Methode wird durch einen Selektor oder SEL identifiziert — eine eindeutige Kennung für jeden Nachrichtennamen, oft nur eine NUL-terminierte Zeichenfolge, die ihren Namen darstellt-und in einen C-Methodenzeiger aufgelöst, der sie implementiert: einen IMP. Eine Folge davon ist, dass das Nachrichtenübergabesystem keine Typprüfung hat. Das Objekt, an das die Nachricht gerichtet ist — der Empfänger — reagiert nicht garantiert auf eine Nachricht, und wenn dies nicht der Fall ist, wird eine Ausnahme ausgelöst.,

Das Senden der Nachrichtenmethode an das Objekt, auf das der Zeiger obj zeigt, erfordert den folgenden Code in C++:

obj->method(argument);

In Objective-C wird dies wie folgt geschrieben:

;

Der Aufruf „method“ wird vom Compiler in objc_msgSend(id) übersetzt .SEL op,…) familie von Laufzeitfunktionen. Verschiedene Implementierungen behandeln moderne Ergänzungen wie Super. In GNU-Familien heißt diese Funktion objc_msg_sendv, wurde jedoch zugunsten eines modernen Nachschlagesystems unter objc_msg_lookup veraltet.,

Beide Programmierstile haben ihre Stärken und Schwächen. Objektorientierte Programmierung im Simula-Stil (C++) ermöglicht die Mehrfachvererbung und schnellere Ausführung durch Verwendung der Kompilierungszeitbindung, wenn möglich, unterstützt jedoch standardmäßig keine dynamische Bindung. Es zwingt auch alle Methoden, eine entsprechende Implementierung zu haben, es sei denn, sie sind abstrakt. Die Smalltalk-Programmierung, wie sie in Objective-C verwendet wird, ermöglicht es Nachrichten, nicht implementiert zu werden, wobei die Methode zur Laufzeit in ihre Implementierung aufgelöst wird., Beispielsweise kann eine Nachricht an eine Sammlung von Objekten gesendet werden, auf die nur von einigen erwartet wird, dass sie antworten, ohne befürchten zu müssen, dass Laufzeitfehler auftreten. Die Nachrichtenübergabe erfordert auch nicht, dass ein Objekt zur Kompilierungszeit definiert wird. Eine Implementierung ist weiterhin erforderlich, damit die Methode im abgeleiteten Objekt aufgerufen werden kann. (Weitere Vorteile der dynamischen (späten) Bindung finden Sie im Abschnitt dynamisches Tippen unten.)

Interfaces and implementationsEdit

Objective-C erfordert, dass die Schnittstelle und Implementierung einer Klasse in separat deklarierten Codeblöcken enthalten sind., Per Konvention platzieren Entwickler die Schnittstelle in einer Header-Datei und die Implementierung in einer Codedatei. Die Header-Dateien, normalerweise beigefügt .h, sind ähnlich wie C-Header-Dateien, während die Implementierung (Methode) Dateien, normalerweise beigefügt .m, kann C-Code-Dateien sehr ähnlich sein.

InterfaceEdit

Dies ist analog zu Klassendeklarationen, wie sie in anderen objektorientierten Sprachen wie C++ oder Python verwendet werden.

Die Schnittstelle einer Klasse wird normalerweise in einer Header-Datei definiert. Eine gängige Konvention besteht darin, die Header-Datei nach dem Namen der Klasse zu benennen, z. B. Ball.,h würde die Schnittstelle für den Klassenball enthalten.

Eine Schnittstellendeklaration hat die Form:

Im obigen Beispiel bezeichnen Pluszeichen Klassenmethoden oder Methoden, die für die Klasse selbst (nicht für eine Instanz) aufgerufen werden können, und Minuszeichen bezeichnen Instanzmethoden, die nur für eine bestimmte Instanz der Klasse aufgerufen werden können. Klassenmethoden haben auch keinen Zugriff auf Instanzvariablen.,

Der obige Code entspricht in etwa der folgenden C++ – Schnittstelle:

Beachten Sie, dass instanceMethod2With2Parameters: param2_callName: das Verschachteln von Selektorsegmenten mit Argumentausdrücken demonstriert, für die es in C/C++kein direktes Äquivalent gibt.

Rückgabetypen können jeder Standard-C-Typ, ein Zeiger auf ein generisches Objective-C-Objekt, ein Zeiger auf einen bestimmten Objekttyp wie NSArray*, NSImage * oder NSString * oder ein Zeiger auf die Klasse sein, zu der die Methode gehört (instancetype). Der Standardrückgabetyp ist die generische Objective-C-Typ-ID.,

Methodenargumente beginnen mit einem Namen, der das Argument kennzeichnet, das Teil des Methodennamens ist, gefolgt von einem Doppelpunkt gefolgt vom erwarteten Argumenttyp in Klammern und dem Argumentnamen. Das Etikett kann weggelassen werden.

Eine Ableitung der Schnittstellendefinition ist die Kategorie, mit der Methoden zu vorhandenen Klassen hinzugefügt werden können.

ImplementationEdit

Die Schnittstelle deklariert nur die Klassenschnittstelle und nicht die Methoden selbst: Der eigentliche Code wird in die Implementierungsdatei geschrieben., Implementierungsdateien (Methoden) haben normalerweise die Dateierweiterung .m, die ursprünglich“Nachrichten“ bedeutete.

@implementation classname+ (return_type)classMethod { // implementation}- (return_type)instanceMethod { // implementation}@end

Methoden werden mit ihren Schnittstellendeklarationen geschrieben.Vergleich von Objective-C und C:

- (int)method:(int)i { return ;}
int function(int i) { return square_root(i);}

Die syntax ermöglicht pseudo-Benennung der Argumente.

Interne Darstellungen einer Methode variieren zwischen verschiedenen Implementierungen von Objective-C., Wenn MyColor die Klassenfarbe hat, kann die Instanzmethode-changeColorToRed: green:blue: intern mit _i_Color_changeColorToRed_green_blue gekennzeichnet sein. Das i bezieht sich auf eine Instanzmethode, wobei die Klassen-und dann Methodennamen angehängt und Doppelpunkte in Unterstriche geändert werden. Da die Reihenfolge der Parameter Teil des Methodennamens ist, kann sie nicht wie bei echten benannten Parametern an den Codierungsstil oder Ausdruck angepasst werden.

Interne Namen der Funktion werden jedoch selten direkt verwendet. Im Allgemeinen werden Nachrichten in Funktionsaufrufe konvertiert, die in der Objective-C-Laufzeitbibliothek definiert sind., Es ist zum Zeitpunkt der Verknüpfung nicht unbedingt bekannt, welche Methode aufgerufen wird, da die Klasse des Empfängers (das Objekt, an das die Nachricht gesendet wird) erst zur Laufzeit bekannt sein muss.

InstanziationEdit

Sobald eine Objective-C-Klasse geschrieben wurde, kann sie instanziiert werden. Dies geschieht, indem zuerst eine nicht initialisierte Instanz der Klasse (ein Objekt) zugewiesen und dann initialisiert wird. Ein Objekt ist erst dann voll funktionsfähig, wenn beide Schritte abgeschlossen sind., Diese Schritte sollten mit einer Codezeile ausgeführt werden, damit niemals ein zugewiesenes Objekt initialisiert wurde (und weil es unklug ist, das Zwischenergebnis beizubehalten, da -init kann ein anderes Objekt als das zurückgeben, auf dem es aufgerufen wird).,

Instanziierung mit dem Standard-Initialisierer ohne Parameter:

MyObject *foo = init];

Instanziierung mit einem benutzerdefinierten Initialisierer:

MyObject *foo = initWithString:myString];

Falls keine benutzerdefinierte Initialisierung durchgeführt wird, kann die Methode „new“ häufig anstelle der alloc-Init-Nachrichten verwendet werden:

MyObject *foo = ;

Einige Klassen implementieren Klassenmethodeninitialisierer., Wie +new kombinieren sie +alloc und , aber im Gegensatz zu +new geben sie eine autoreleased Instanz zurück. Einige Klassenmethodeninitialisierer verwenden Parameter:

MyObject *foo = ;MyObject *bar = ;

Die alloc-Nachricht weist genügend Speicher zu, um alle Instanzvariablen für ein Objekt zu speichern, setzt alle Instanzvariablen auf Nullwerte und verwandelt den Speicher in eine Instanz der Klasse; Zu keinem Zeitpunkt während der Initialisierung ist der Speicher eine Instanz der Oberklasse.,

Die Init-Nachricht führt die Einrichtung der Instanz bei der Erstellung durch. Die init-Methode wird häufig wie folgt geschrieben:

- (id)init { self = ; if (self) { // perform initialization of object here } return self;}

Beachten Sie im obigen Beispiel den Rückgabetyp id. Dieser Typ steht in Objective-C für „Zeiger auf ein beliebiges Objekt“ (siehe Abschnitt Dynamische Eingabe).

Das Initialisierungsmuster wird verwendet, um sicherzustellen, dass das Objekt von seiner Oberklasse ordnungsgemäß initialisiert wird, bevor die init-Methode seine Initialisierung durchführt., Es führt die folgenden Aktionen aus:

  1. self = Sendet der übergeordneten Instanz eine init-Nachricht und weist das Ergebnis selbst (Zeiger auf das aktuelle Objekt).
  2. if (self)Prüft, ob der zurückgegebene Objektzeiger gültig ist, bevor eine Initialisierung durchgeführt wird.
  3. gibt selstreturns den Wert von self an den Aufrufer zurück.

Ein nicht gültiger Objektzeiger hat den Wert nil; Bedingte Anweisungen wie “ if “ behandeln nil wie einen Nullzeiger, sodass der Initialisierungscode nicht ausgeführt wird, wenn nil zurückgegeben wird., Wenn bei der Initialisierung ein Fehler auftritt, sollte die init-Methode alle erforderlichen Bereinigungen durchführen, einschließlich des Sendens einer „release“ – Nachricht an self, und null zurückgeben, um anzuzeigen, dass die Initialisierung fehlgeschlagen ist. Eine Überprüfung auf solche Fehler darf nur durchgeführt werden, nachdem die Oberklasseninitialisierung aufgerufen wurde, um sicherzustellen, dass die Zerstörung des Objekts korrekt erfolgt.

Wenn eine Klasse mehr als eine Initialisierungsmethode hat, muss nur eine von ihnen (der „designierte Initialisierer“) diesem Muster folgen; andere sollten den designierten Initialisierer anstelle des Superklasse-Initialisierers aufrufen.,

ProtocolsEdit

In anderen Programmiersprachen, werden diese als „Schnittstellen“.

Objective-C wurde bei NeXT erweitert, um das Konzept der Mehrfachvererbung der Spezifikation, aber nicht der Implementierung, durch die Einführung von Protokollen einzuführen. Dies ist ein Muster, das entweder als abstrakte, mehrfach geerbte Basisklasse in C++ oder als „Schnittstelle“ (wie in Java und C#) erreicht werden kann. Objective-C verwendet Ad-hoc-Protokolle, die als informelle Protokolle bezeichnet werden, und Compiler-erzwungene Protokolle, die als formale Protokolle bezeichnet werden.,

Ein informelles Protokoll ist eine Liste von Methoden, die eine Klasse implementieren kann. Es ist in der Dokumentation angegeben, da es in der Sprache nicht vorhanden ist. Informelle Protokolle werden als Kategorie (siehe unten) für NSObject implementiert und enthalten häufig optionale Methoden, die, wenn sie implementiert werden, das Verhalten einer Klasse ändern können. Beispielsweise verfügt eine Textfeldklasse möglicherweise über einen Delegaten, der ein informelles Protokoll mit einer optionalen Methode zum automatischen Vervollständigen von vom Benutzer eingegebenem Text implementiert., Das Textfeld ermittelt, ob der Delegat diese Methode implementiert (über Reflektion), und ruft in diesem Fall die Methode des Delegaten auf, um die Funktion zum automatischen Vervollständigen zu unterstützen.

Ein formales Protokoll ähnelt einer Schnittstelle in Java, C# und Ada 2005. Es ist eine Liste von Methoden, zu deren Implementierung sich jede Klasse deklarieren kann. Versionen von Objective-C vor 2.0 erforderten, dass eine Klasse alle Methoden in einem Protokoll implementieren muss, das sie selbst als Standard deklariert; Der Compiler gibt einen Fehler aus, wenn die Klasse nicht jede Methode aus ihren deklarierten Protokollen implementiert. Objective-C-2.,0 zusätzliche Unterstützung für die Markierung bestimmter Methoden in einem Protokoll optional, und der Compiler wird nicht erzwingen Implementierung von optionalen Methoden.

Eine Klasse muss deklariert werden, um dieses Protokoll zu implementieren, damit es ihm entspricht. Dies ist zur Laufzeit nachweisbar. Formale Protokolle können keine Implementierungen bereitstellen; Sie versichern Anrufern einfach, dass Klassen, die dem Protokoll entsprechen, Implementierungen bereitstellen. In der NeXT/Apple-Bibliothek werden vom Verteilten Objektsystem häufig Protokolle verwendet, um die Fähigkeiten eines Objekts darzustellen, das auf einem Remote-System ausgeführt wird.,

Die syntax

@protocol NSLocking- (void)lock;- (void)unlock;@end

bezeichnet dass es die abstrakte Idee der Verriegelung. Indem in der Klassendefinition angegeben wird, dass das Protokoll implementiert ist, behaupten

@interface NSLock : NSObject <NSLocking>// ...@end

Instanzen von NSLock, dass sie eine Implementierung für die beiden Instanzmethoden bereitstellen.

Dynamic typingEdit

Objective-C kann wie Smalltalk dynamische Typisierung verwenden: Ein Objekt kann eine Nachricht gesendet werden, die in seiner Schnittstelle nicht angegeben ist., Dies kann eine erhöhte Flexibilität ermöglichen, da ein Objekt eine Nachricht „erfassen“ und die Nachricht an ein anderes Objekt senden kann, das angemessen auf die Nachricht reagieren kann, oder die Nachricht ebenfalls an ein anderes Objekt senden kann. Dieses Verhalten wird als Nachrichtenweiterleitung oder Delegierung bezeichnet (siehe unten). Alternativ kann ein Fehlerhandler verwendet werden, falls die Nachricht nicht weitergeleitet werden kann. Wenn ein Objekt keine Nachricht weiterleitet, darauf antwortet oder einen Fehler behandelt, generiert das System eine Laufzeitausnahme., Wenn Nachrichten an nil (den Null-Objektzeiger) gesendet werden, werden sie je nach Compiler-Optionen stillschweigend ignoriert oder lösen eine generische Ausnahme aus.

Optional können auch statische Tippinformationen zu Variablen hinzugefügt werden. Diese Informationen werden dann zur Kompilierungszeit überprüft. In den folgenden vier Aussagen werden zunehmend spezifische Typinformationen bereitgestellt. Die Anweisungen sind zur Laufzeit äquivalent, aber die zusätzlichen Informationen ermöglichen es dem Compiler, den Programmierer zu warnen, wenn das übergebene Argument nicht mit dem angegebenen Typ übereinstimmt.,

- (void)setMyValue:(id)foo;

In der obigen Anweisung foo kann von jeder Klasse.

- (void)setMyValue:(id<NSCopying>)foo;

In der obigen Anweisung kann foo eine Instanz jeder Klasse sein, die dem – Protokoll entspricht.

- (void)setMyValue:(NSNumber *)foo;

In der obigen Anweisung muss foo eine Instanz der NSNumber Klasse sein.

- (void)setMyValue:(NSNumber<NSCopying> *)foo;

In der obigen Anweisung muss foo eine Instanz der NSNumber-Klasse sein und dem Protokoll entsprechen.,

In Objective-C werden alle Objekte als Zeiger dargestellt und eine statische Initialisierung ist nicht zulässig. Das einfachste Objekt ist der Typ, auf den id (objc_obj *) verweist, auf den nur ein isa-Zeiger seine Klasse beschreibt. Andere Typen von C, wie Werte und Strukturen, sind unverändert, da sie nicht Teil des Objektsystems sind. Diese Entscheidung unterscheidet sich vom C++ – Objektmodell, in dem Strukturen und Klassen vereint sind.

ForwardingEdit

Objective-C erlaubt das Senden einer Nachricht an ein Objekt, das möglicherweise nicht antwortet., Anstatt zu antworten oder einfach die Nachricht zu löschen, kann ein Objekt die Nachricht an ein Objekt weiterleiten, das antworten kann. Die Weiterleitung kann verwendet werden, um die Implementierung bestimmter Entwurfsmuster zu vereinfachen, z. B. des Beobachtermusters oder des Proxy-Musters.

Die Objective-C-Laufzeit gibt ein Methodenpaar in Object

an Ein Objekt, das die Weiterleitung implementieren möchte, muss die Weiterleitungsmethode nur mit einer neuen Methode überschreiben, um das Weiterleitungsverhalten zu definieren. Die Aktionsmethode performv:: muss nicht überschrieben werden, da diese Methode lediglich eine Aktion basierend auf dem Selektor und den Argumenten ausführt., Beachten Sie den Typ SEL, der der Typ der Nachrichten in Objective-C.

Hinweis: In OpenStep, Cocoa und GNUstep, den häufig verwendeten Frameworks von Objective-C, verwendet man nicht die Objektklasse. Die – (void)forwardInvocation: (NSInvocation *)anInvocation Methode der NSObject Klasse wird verwendet, um Weiterleitung zu tun.

ExampleEdit

Hier ist ein Beispiel für ein Programm, das die Grundlagen der Weiterleitung demonstriert.

Forwarder.h Spediteur.m Empfänger.h

#import <objc/Object.h>// A simple Recipient object.@interface Recipient : Object- (id)hello;@end

Empfänger.m

#import "Recipient.h"@implementation Recipient- (id)hello { printf("Recipient says hello!\n"); return self;}@end

main.,m

NotesEdit

Beim Kompilieren mit gcc meldet der Compiler:

Der Compiler meldet den zuvor gemachten Punkt, dass der Forwarder nicht auf Hallo-Nachrichten reagiert. Unter diesen Umständen ist es sicher, die Warnung zu ignorieren, da die Weiterleitung implementiert wurde. Das Ausführen des Programms erzeugt diese Ausgabe:

$ ./a.outRecipient says hello!

KategorienEdit

Während des Entwurfs von Objective-C war eines der Hauptanliegen die Wartbarkeit großer Codebasen., Die Erfahrung aus der Welt der strukturierten Programmierung hatte gezeigt, dass eine der wichtigsten Möglichkeiten zur Verbesserung des Codes darin bestand, ihn in kleinere Teile zu zerlegen. Objective-C entlehnte und erweiterte das Konzept der Kategorien aus Smalltalk-Implementierungen, um diesen Prozess zu unterstützen.

Außerdem werden die Methoden innerhalb einer Kategorie zur Laufzeit zu einer Klasse hinzugefügt. Daher erlauben Kategorien dem Programmierer, einer vorhandenen Klasse – einer offenen Klasse-Methoden hinzuzufügen, ohne diese Klasse neu kompilieren zu müssen oder sogar Zugriff auf den Quellcode zu haben., Wenn ein System beispielsweise keine Rechtschreibprüfung in seiner String-Implementierung enthält, kann es hinzugefügt werden, ohne den String-Quellcode zu ändern.

Methoden innerhalb von Kategorien unterscheiden sich nicht von den Methoden in einer Klasse, wenn das Programm ausgeführt wird. Eine Kategorie hat vollen Zugriff auf alle Instanzvariablen innerhalb der Klasse, einschließlich privater Variablen.

Wenn eine Kategorie eine Methode mit derselben Methodensignatur deklariert wie eine vorhandene Methode in einer Klasse, wird die Methode der Kategorie übernommen. Somit können Kategorien einer Klasse nicht nur Methoden hinzufügen, sondern auch vorhandene Methoden ersetzen., Diese Funktion kann verwendet werden, um Fehler in anderen Klassen durch Umschreiben ihrer Methoden zu beheben oder das Verhalten einer Klasse innerhalb eines Programms global zu ändern. Wenn zwei Kategorien Methoden mit demselben Namen, aber unterschiedlichen Methodensignaturen haben, ist nicht definiert, welche Methode der Kategorie übernommen wird.

Andere Sprachen haben versucht, diese Funktion auf verschiedene Arten hinzuzufügen. TOM ging das Objective-C-System noch einen Schritt weiter und erlaubte auch das Hinzufügen von Variablen. Andere Sprachen haben stattdessen prototypbasierte Lösungen verwendet, wobei die bemerkenswerteste Self ist.

Die C# – und Visual Basic.,Netzsprachen implementieren oberflächlich ähnliche Funktionen in Form von Erweiterungsmethoden, denen jedoch der Zugriff auf die privaten Variablen der Klasse fehlt. Ruby und mehrere andere dynamische Programmiersprachen bezeichnen die Technik als“Monkey Patching“.

Logtalk implementiert ein Konzept von Kategorien (als erstklassige Entitäten), das die Funktionalität von Objective-C-Kategorien subsumiert (Logtalk-Kategorien können auch als feinkörnige Kompositionseinheiten verwendet werden, wenn z. B. neue Klassen oder Prototypen definiert werden; insbesondere kann eine Logtalk-Kategorie praktisch von einer beliebigen Anzahl von Klassen und Prototypen importiert werden).,

Beispiel Verwendung von categoriesEdit

Dieses Beispiel baut eine ganzzahlige Klasse auf, indem zuerst eine Basisklasse mit nur implementierten Accessor-Methoden definiert und zwei Kategorien hinzugefügt werden, Arithmetik und Anzeige, die die Basisklasse erweitern. Während Kategorien auf die privaten Datenelemente der Basisklasse zugreifen können, ist es häufig eine gute Praxis, über die Accessor-Methoden auf diese privaten Datenelemente zuzugreifen, wodurch Kategorien unabhängiger von der Basisklasse bleiben. Die Implementierung solcher Accessoren ist eine typische Verwendung von Kategorien. Eine andere besteht darin, Kategorien zu verwenden, um der Basisklasse Methoden hinzuzufügen., Es wird jedoch nicht als gute Praxis angesehen, Kategorien für das Überschreiben von Unterklassen zu verwenden, die auch als Affenpatching bezeichnet werden. Informelle Protokolle werden als Kategorie in der NSObject-Basisklasse implementiert. Per Konvention nehmen Dateien mit Kategorien, die Basisklassen erweitern, den Namen BaseClass+ExtensionClass.h.

Ganzzahl.h

#import <objc/Object.h>@interface Integer : Object { int integer;}- (int)integer;- (id)integer:(int)_integer;@end

Integer.m Ganzzahl+Arithmetik.h

#import "Integer.h"@interface Integer (Arithmetic)- (id) add: (Integer *) addend;- (id) sub: (Integer *) subtrahend;@end

Integer+Arithmetik.m Ganzzahl + Anzeige.h

#import "Integer.h"@interface Integer (Display)- (id) showstars;- (id) showint;@end

Integer+ – Display.m main.,m

NotesEdit

Die Kompilierung wird beispielsweise durchgeführt durch:

gcc -x objective-c main.m Integer.m Integer+Arithmetic.m Integer+Display.m -lobjc

Man kann experimentieren, indem man die #import “ Integer+Arithmetik weglässt.h“ und Linien und Weglassen Integer+Arithmetik.m in der Zusammenstellung. Das Programm wird weiterhin ausgeführt. Dies bedeutet, dass es möglich ist, zu mix-and-match-Kategorien Hinzugefügt, wenn nötig; wenn eine Kategorie nicht müssen haben die Fähigkeit, es kann einfach nicht kompiliert.

PosingEdit

Objective-C erlaubt einer Klasse, eine andere Klasse innerhalb eines Programms vollständig zu ersetzen. Die ersetzende Klasse soll sich als Zielklasse „darstellen“.,

Class 1 wurde mit Mac OS X v10.5 als veraltet deklariert und ist in der 64-Bit-Laufzeit nicht verfügbar. Eine ähnliche Funktionalität kann erreicht werden, indem Method Swizzling in Kategorien verwendet wird, das die Implementierung einer Methode mit der einer anderen Methode vertauscht, die dieselbe Signatur hat.

Für die Versionen, die noch Posing unterstützen, werden stattdessen alle an die Zielklasse gesendeten Nachrichten von der Posing-Klasse empfangen. Es gibt mehrere Einschränkungen:

  • Eine Klasse darf nur als eine ihrer direkten oder indirekten Oberklassen auftreten.,
  • Die Zielklasse darf keine neuen Instanzvariablen definieren, die in der Zielklasse fehlen (obwohl sie Methoden definieren oder überschreiben kann).
  • Die Zielklasse hat vor dem Posieren möglicherweise keine Nachrichten empfangen.

Das Posieren, ähnlich wie bei Kategorien, ermöglicht die globale Erweiterung bestehender Klassen. Posing erlaubt zwei Funktionen, die in Kategorien fehlen:

  • Eine Posing-Klasse kann überschriebene Methoden über super aufrufen und so die Implementierung der Zielklasse einbeziehen.
  • Eine bestimmte Klasse kann Methoden überschreiben, die in Kategorien definiert sind.,

Zum Beispiel

Dies fängt jeden Aufruf von setMainMenu an NSApplication ab.

#importEdit

In der C-Sprache bewirkt die #include pre-compile-Direktive immer, dass der Inhalt einer Datei an diesem Punkt in die Quelle eingefügt wird. Objective-C hat die#import Direktive, äquivalent, außer dass jede Datei nur einmal pro Kompilierungseinheit enthalten ist, was die Notwendigkeit von Include Guards überflüssig macht.

Linux-gcc compilationEdit

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.