iphone hacks - Versteckte Merkmale von Objective-C




4 Answers

Methode Swizzling

Grundsätzlich können Sie zur Laufzeit eine Implementierung einer Methode gegen eine andere austauschen.

Hier ist eine Erklärung mit Code.

Ein cleverer Anwendungsfall ist das verzögerte Laden einer freigegebenen Ressource: Normalerweise würden Sie eine sharedFoo Methode implementieren, indem Sie eine Sperre erwerben, bei Bedarf das foo erstellen, seine Adresse sharedFoo , die Sperre sharedFoo und dann foo . Dies stellt sicher, dass das foo nur einmal erstellt wird, aber jeder nachfolgende Zugriff verschwendet Zeit mit einer Sperre, die nicht mehr benötigt wird.

Mit dem Swizzling der Methode können Sie dasselbe wie zuvor tun, außer wenn das foo einmal erstellt wurde, swizzling verwenden, um die ursprüngliche Implementierung von sharedFoo durch eine zweite zu sharedFoo , die keine Checks durchführt, und einfach das foo zurückgibt, von dem wir wissen, dass es erstellt wurde !

Natürlich kann das Swizzling der Methode Sie in Schwierigkeiten bringen, und es kann Situationen geben, in denen das obige Beispiel eine schlechte Idee ist, aber hey ... deshalb ist es eine versteckte Funktion.

deutsch apple

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.



Objektweiterleitung / Methode fehlt

Wenn ein Objekt eine Nachricht erhält, für die es keine Methode hat, gibt das Laufzeitsystem ihm eine weitere Möglichkeit, den Anruf zu bearbeiten, bevor er aufgibt. Wenn das Objekt eine -forward :: -Methode unterstützt, ruft die Laufzeit diese Methode auf und übergibt ihr Informationen über den unbehandelten Aufruf. Der Rückgabewert des weitergeleiteten Aufrufs wird an den ursprünglichen Aufrufer der Methode zurückgegeben.

-(retval_t)forward:(SEL)sel :(arglist_t)args {
  if ([myDelegate respondsTo:sel])
 return [myDelegate performv:sel :args]
 else
 return [super forward:sel :args];
 }

Inhalt von Objective-C Pocket Reference

Dies ist sehr mächtig und wird stark in der Ruby-Community für die verschiedenen DSLs und Rails etc. verwendet. Entstanden in Smalltalk, die sowohl Objective-C als auch Ruby beeinflusst haben.




#include <Foundation/Debug.h>

Viele Tools zum Aufspüren von Speicherlecks, vorzeitigen Deallocs und mehr in dieser Header-Datei.




Objective-C-Laufzeitreferenz

Es ist leicht zu vergessen, dass der syntaktische Zucker von Objective-C in normale C-Funktionsaufrufe umgewandelt wird, die die Object-C-Laufzeit sind. Es ist wahrscheinlich, dass Sie sich nie wirklich in die Laufzeit einarbeiten müssen. Deshalb würde ich das als "verstecktes Merkmal" betrachten.

Lass mich einen Weg geben, wie man das Laufzeitsystem benutzen kann.

Angenommen, jemand entwirft eine externe Framework-API, die von Dritten verwendet wird. Und dass jemand eine Klasse in dem Rahmen entwirft, der abstrakt ein Datenpaket darstellt, nennen wir es MLAbstractDataPacket . Jetzt liegt es an der Anwendung, die im Framework mit der Unterklasse MLAbstractDataPacket und die Unterklassen-Datenpakete definiert. Jede Unterklasse muss die Methode +(BOOL)isMyKindOfDataPacket:(NSData *)data .

Mit diesen Informationen im Hinterkopf ...

Es wäre nett, wenn MLAbstractDataPacket eine bequeme Methode zur Verfügung stellen würde, die die korrekte initialisierte Klasse für ein Datenpaket +(id)initWithDataPacket:(NSData *)data , das in der Form +(id)initWithDataPacket:(NSData *)data .

Hier gibt es nur ein Problem. Die Oberklasse kennt keine ihrer Unterklassen. Hier können Sie also die Laufzeitmethode objc_getClassList() zusammen mit objc_getSuperclass() , um die Klassen zu finden, die Unterklassen von MLAbstractDataPacket sind. Sobald Sie eine Liste von Unterklassen haben, können Sie +isMyKindOfDataPacket: versuchen +isMyKindOfDataPacket: an jedem, bis einer gefunden oder nicht gefunden wird.

Die Referenzinformationen dazu finden Sie unter http://developer.apple.com/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html .




Related

iphone objective-c osx hidden-features