Comment implémenter la méthode swizzling?
Je suis en train de modifier le comportement d'un programme (je n'ai pas la source) à l'aide de SIMBL. J'ai utilisé la classe de vidage trouvé et que j'ai besoin d'annuler une méthode d'instance
Cette méthode est dans la classe de contrôleurs. Tout ce que je dois faire est d'obtenir l'argument arg1 et c'est tout. Peut-être NSLog ou de publier un avis...
J'ai lu sur la méthode swizzling en objective-c, mais comment puis-je l'utiliser?. J'aurais besoin de référer à la classe MessageController dont bien sûr je n'ai pas.
Merci!
source d'informationauteur user635064
Vous devez vous connecter pour publier un commentaire.
Je devine que vous devez appeler la mise en œuvre d'origine après avoir fait votre NSLog; si non, vous pouvez être en mesure d'utiliser une catégorie de la classe de remplacer la méthode.
De swizzle la méthode, d'abord vous avez besoin d'une méthode de remplacement. J'ai l'habitude de mettre quelque chose comme cela dans une catégorie de la classe cible:
Il semble que ça va de manière récursive appel lui-même, mais il ne sera pas parce que nous allons échanger les choses autour de sorte que l'appel de
ReceiveMessage:
appels ce méthode tout en appelantreplacementReceiveMessage:
appelle l'ancienne version.La deuxième étape consiste à utiliser le moteur d'exécution des fonctions pour effectuer l'échange. L'avantage de l'utilisation d'une catégorie, c'est que vous pouvez utiliser
load
dans la catégorie à faire le travail:Il y a deux cas qui doivent être traitées:
class_addMethod
pour ajouter une mise en œuvre deReceiveMessage:
de la classe cible, ce que nous faisons à l'aide de notre mise en œuvre de remplacement. Ensuite, nous pouvons utiliserclass_replaceMethod
pour remplacerreplacementReceiveMessage:
avec l'implémentation de la superclasse, de sorte que notre nouvelle version sera en mesure de bien l'appel de l'ancien.class_addMethod
échoue, mais ensuite, nous pouvons utilisermethod_exchangeImplementations
juste changer les nouveaux et les anciens versions.La bibliothèque jrswizzle gère. Faire soi-même n'est pas recommandé, car il y a beaucoup de détails pour obtenir le droit. (Voir la table de documenter les échecs des précédentes mises en œuvre dans les jrswizzle readme.)
Dire que vous avez la classe comme ceci:
Vous pouvez l'utiliser comme ceci:
De sortie: