[iphone] Versteckte Merkmale von Objective-C


Answers

Posieren

Objective-C ermöglicht einer Klasse, eine andere Klasse innerhalb einer Anwendung vollständig zu ersetzen . Die Ersetzungsklasse soll die Zielklasse "darstellen". Alle an die Zielklasse gesendeten Nachrichten werden dann stattdessen von der posierenden Klasse empfangen. Es gibt einige Einschränkungen für die Klassen:

  • Eine Klasse kann nur als eine ihrer direkten oder indirekten Superklassen auftreten
  • Die posierende Klasse darf keine neuen Instanzvariablen definieren, die in der Zielklasse fehlen (obwohl sie Methoden definieren oder überschreiben können).
  • Vor dem Posieren dürfen keine Nachrichten an die Zielklasse gesendet worden sein.

Posieren, ähnlich wie Kategorien, ermöglicht das globale Erweitern bestehender Klassen . Posing erlaubt zwei Merkmale, die in den Kategorien fehlen:

  • Eine posierende Klasse kann überschriebene Methoden durch super aufrufen und so die Implementierung der Zielklasse einbeziehen.
  • Eine Haltungsklasse kann Methoden überschreiben, die in Kategorien definiert sind.

Ein Beispiel:

@interface CustomNSApplication : NSApplication
@end

@implementation CustomNSApplication
- (void) setMainMenu: (NSMenu*) menu
{
     // do something with menu
}
@end

class_poseAs ([CustomNSApplication class], [NSApplication class]);

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

Question

Objective-C wird aufgrund seiner Verwendung durch Apple für die Entwicklung von Mac OS X und iPhone immer breiter eingesetzt. Was sind einige Ihrer bevorzugten "versteckten" Merkmale der Objective-C-Sprache?

  • Ein Feature pro Antwort.
  • Geben Sie ein Beispiel und eine kurze Beschreibung der Funktion an, nicht nur einen Link zur Dokumentation.
  • Beschriften Sie das Feature mit einem Titel als erste Zeile.



Ich mag die ausführliche Methode namens [myArray writeToFile:myPath atomically:YES] , wobei jedes Argument eine Bezeichnung hat.




ISA-Umschaltung

Müssen alle Verhalten eines Objekts überschrieben werden? Sie können die Klasse eines aktiven Objekts mit einer einzigen Codezeile ändern:

obj->isa = [NewClass class];

Dies ändert nur die Klasse, die Methodenaufrufe für dieses Objekt empfängt. Es ändert nicht das Layout des Objekts im Speicher. Daher ist dies nur dann nützlich, wenn Sie eine Gruppe von Klassen mit denselben Ivars (oder eine mit einer Teilmenge der anderen) haben und zwischen diesen wechseln möchten.

Ein Stück Code, den ich geschrieben habe, verwendet dies zum Lazy-Laden: Es weist ein Objekt der Klasse A , füllt ein paar kritische Ivars (in diesem Fall hauptsächlich eine Datensatznummer) und schaltet den isa Zeiger auf LazyA . Wenn eine andere Methode als ein sehr kleiner Satz wie release und retain aufgerufen wird, lädt LazyA alle Daten von der Festplatte, füllt die Ivars aus, schaltet den isa Zeiger zurück auf A und leitet den Aufruf an die reale Klasse weiter.




Kategorien

Mithilfe von Kategorien können Sie Methoden zu integrierten Klassen ohne Unterklassen hinzufügen. Vollständige Referenz .

Es ist hilfreich, häufig verwendeten Klassen wie NSString oder NSData Convenience-Methoden hinzuzufügen.




Links