Erstellen ein IMP aus einem Objective-C-block
Den IMP
geben Sie in Objective-C stellt eine Funktion Zeiger, wie weit ich als verstehen. Gibt es eine Möglichkeit, um eine IMP
aus einem block-pointer? Vielen Dank für Eure Ideen.
- Ich habe eine Reihe von tags; 'objective-c-Laufzeit' ist nicht ein sehr Häufig verwendeter tag und dieser [sehr interessant] Frage war, ab in das Unkraut.
- Vielen Dank dafür, bbum!
- jedoch, was ist das Ziel, immer die IMP aus einem block?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seit dies geschrieben wurde, gibt es nun die API in iOS und Mac OS-X, die erlaubt, dass die Blöcke sich in IMPs direkt. Ich schrieb ein weblog-Beitrag Beschreibung der API (imp_implementationWithBlock()).
Block ist tatsächlich eine Struktur, die ein bit enthält, die Metadaten, ein Verweis auf den code innerhalb des Blocks und eine Kopie der const-kopiert Daten erfasst werden, innerhalb des Blocks.
So, Nein, es gibt keine Möglichkeit, direkt die Zuordnung zwischen einem
IMP
und einer Block-Referenz.Wenn Sie einen Anruf zu einem block zusammengestellt, der compiler gibt ein Trampolin, setzt den stack frame und springt dann auf den ausführbaren code innerhalb des Blocks.
Was Sie allerdings tun können, ist, erstellen Sie ein IMP, dass Handlungen, wie das Trampolin. Für die folgenden, benötigen Sie eine spezifische IMP für jeden Satz von Argumente & return-Typen aufgerufen werden. Wenn Sie brauchen, um dieses generische, müssen Sie mit der Montage.
Dafür, ich bin einrichten unique block instances pro Instanz der Klasse. Wenn Sie möchten, eine generische block, der wirkt über alle Instanzen hinweg, bauen Sie ein hash von
SEL
-> block pro Klasse.(1) Zuordnen der Blöcke zu handeln, wie IMPs mit der dazugehörigen Referenzen Mechanismus. So etwas wie:
(2) implementieren Sie ein Trampolin IMP so etwas wie dieses:
(3) Sachen, die über Trampolin für jeden selector über die Objective-C-runtime-API (siehe
method_setImplementation
und wie)Vorsichtsmaßnahmen:
dieser eingegeben wurde in StackOverflow. Der code wird ähnlich, aber wahrscheinlich etwas anders.
den [implementingBlock kopieren] ist kritisch; Blöcke start in das Leben auf dem Stapel (in der Regel)
NSMutableDictionary
Instanz-variable. Ich hätte nie gedacht, zu verwendenobjc_setAssociatedObject
, obwohl. Das ist genial.imp_implementationWithBlock()
wurde NDA würde.Ich glaube, Mike Ash, mit etwas Hilfe von Landon Fuller, gelöst hat dies für den Allgemeinen Fall, einschließlich iOS, das ist schwieriger. Er hat eine Klasse auf github die wiederum einen block in eine Funktion Zeiger.
Möglicherweise möchten Sie auch zu verleihen, der Ankündigung und einige interessante follow-up-Diskussion auf Kakao-ungebunden.
UPDATE: Und jetzt gibt es
imp_implementationWithBlock()
wie die oben erwähnten.