Ich möchte ein kleines Plugin-System für Objekte in objective-c erstellen.Objective-C Funktionalität zu jeder Methode eines Objekts hinzufügen
Jetzt bin ich an der Stelle fest, wo ich dynamisch will (zur Laufzeit) zu jeder Funktion in einem Objekt eine Codezeile hinzuzufügen.
Ich habe mit der Laufzeitbibliothek herum gespielt, kam aber zu keiner Lösung, noch.
Was ich bisher versucht haben, ist dies:
id (^impyBlock)(id, id, ...) = ^(id self_, id arguments, ...)
{
// My custom code for every function here
id (*func)(__strong id,SEL,...) = (id (*)(__strong id, SEL, ...))imp;
return func(obj, s, arguments);
};
id (*impyFunct)(id, SEL,...) = imp_implementationWithBlock(impyBlock);
method_setImplementation(mList[i], impyFunct);
Mein Problem ist, wenn es mehr als ein Argument ist, ich habe keine Chance, sie zu übergeben „func()“. AFAIK ist das nicht möglich in C.
Eine andere Lösung, über die ich nachgedacht habe, ist etwas Magie mit Methodenwechsel.
In den Schritten:
- erstellen „swizzle-Methode“, die gerade ruft meine eigenen Code und ruft die ursprüngliche Methode danach (durch ein Namensschema)
- Ändern der IMP jeder Funktion mit dem von die „swizzle-Methode“
- erstellen Ihnen eine neue Methode mit der „alten“ Implementierung und wie „___name“ zu nennen
In dieser Lösung i am Punkt steckte 3. ich habe keinen Mana ein Schema ändern ged, um dynamisch eine vollständige neue Methode zu erstellen.
Hat jemand mich mit meinen Problemen oben helfen können, oder hat eine andere Lösung für eine „alle Methode Funktionalität fangen“.
Das beste wäre etwas wie forwardInvocation, das auch bereits definierte Funktionen fängt.
Danke für Ihre Hilfe!
Dies ist eine ziemlich intensive schwarze Magie. Bist du sicher, dass du das tun musst? Ich liebe es, selbst mit solchen Sachen herumzuspielen und sie zu unterstützen, aber es könnte einen besseren Weg geben, um dein _true_ Ziel zu erreichen. –
Haben Sie andere Ideen für ein Plugin-System, wo ich in jeder Funktion eines Objekts "haken" kann. (Der Hooking-Teil funktioniert ganz gut, aber der Aufruf der Originalimplementierung ist der Schlüssel des Problems) – regexp
Nachdem ich etwas Ähnliches gemacht habe, kann ich dir vielleicht etwas Zeit sparen: Du wirst schließlich eine Steinmauer treffen, wenn du zu variadischen Methoden kommst wie 'stringWithFormat:'). Wenn das ein Deal-Breaker für Sie ist, rate ich Ihnen, jetzt aufzugeben. – ipmcc