J'essaie de suivre les instructions (brillantes) de here, mais j'ai une instance d'une classe que je ne peux pas modifier en sous-classe. Est-il possible de substituer des méthodes à une instance de la classe seulement?Monkey corrige une instance dans Objective-C
Répondre
Attention! Vous êtes sur le point d'entrer une magie assez profonde dans ObjC, et les types de bogues que vous pouvez générer sont hallucinants. Ce sont les dernières techniques que vous devriez utiliser après que tout le reste a échoué, et vous devriez faire tout ce que vous pouvez pour isoler ce code. Cela dit, ObjC est un langage hautement dynamique, et vous pouvez recâbler la plupart des choses. Tout d'abord, à votre question spécifique, vous pouvez changer la classe d'une instance, ce qui permettra d'atteindre ce que vous voulez. Les règles sont essentiellement:
- La nouvelle classe devrait être une sous-classe de l'ancienne classe
- La nouvelle classe ne doit pas ajouter de Ivars. L'ajout d'ivars dans la sous-classe est l'une des choses qui peuvent mener aux bugs de l'esprit mentionnés ci-dessus.
Vous n'obtiendrez pas d'avertissements ou d'erreurs si vous faites ce problème. Vous aurez juste des accidents bizarres.
Étant donné que, en changeant la classe d'un objet est en fait très simple:
object->isa = [NewClass class];
Au-delà, vous pouvez modifier la mise en œuvre d'une méthode pour chaque instance d'une classe à l'aide de la méthode swizzling. J'ai quelques exemples de ceci dans Hijacking with method_exchangeImplementations(). Bonne chance d'utiliser le débogueur une fois que vous avez fait cela, cependant.
En fait, vous pouvez modifier n'importe quoi avec un sous-classement. C'est une des choses les plus délicates que vous pouvez faire, et vous pouvez regarder dans swizling de méthode à la place (mais la méthode swizling affectera tous les membres de la classe), mais dans l'objectif c, il est super facile de définir la classe de n'importe quel objet. Tout ce que vous avez à faire est de déclarer une sous-classe qui ne déclare pas d'ivars supplémentaire, et remplace seulement les méthodes dont vous avez besoin (et vous voulez probablement appeler la super implémentation), puis changez la classe d'un objet à l'exécution via object_setClass (déclaré dans).
Merci, ça aide. –
- 1. Analyseur AMF0 dans ObjectiveC
- 2. Monkey-patch Python class
- 3. Lua + SWIG Monkey Patching
- 4. Documentation sur Eclipse Monkey
- 5. Personnalisation de writeToFile dans ObjectiveC
- 6. Combine chaîne en ObjectiveC
- 7. NSString question ObjectiveC
- 8. Chargement d'une séquence d'images dans InterfaceBuilder -ObjectiveC
- 9. MVC utilisé dans la programmation ObjectiveC
- 10. alloca et ObjectiveC Garbage Collector
- 11. Reliure ObjectiveC classe C# problème
- 12. python instructions d'impression corrige OverflowError
- 13. construire Mozilla Spider Monkey sur Ubuntu
- 14. Android test de l'interface utilisateur: Monkey coincé dans quelques activités
- 15. () une instance
- 16. Comment savez-vous qui corrige la construction?
- 17. Cela corrige à nouveau l'erreur C2679 VC++
- 18. Requête UPDATE qui corrige des enregistrements orphelins
- 19. jquery livequery ne corrige pas autosuggest?
- 20. Allocation de mémoire dynamique 2D - ObjectiveC
- 21. corrige le dernier élément modifié dans plusieurs balises de sélection?
- 22. Puis-je placer un sélecteur ObjectiveC @ dans un NSDictionary?
- 23. Comment résoudre les fuites dans le code suivant? ObjectiveC
- 24. une instance hot-swapping lui-même avec une nouvelle instance
- 25. Une seule instance d'un modèle dans Rails
- 26. Comment terminer une activité dans cette instance?
- 27. Créer une instance HtmlHelper dans le contrôleur
- 28. Comment enregistrer un fichier en utilisant Eclipse Monkey?
- 29. Créer un cercle/une bulle de couleur par programmation dans ObjectiveC et Cocoa
- 30. Comment puis-je simplement changer une variable de classe d'une autre classe dans ObjectiveC?
Merci pour cela. C'est fascinant, mais cela m'a convaincu de m'en tenir à mes forces et d'éviter cela à tout prix. –
En fait, ne semble pas trop mauvais, en fait pourrait bien fonctionner dans mon cas. –
Utilisé avec soin, c'est en fait très simple. Faites tout ce que vous pouvez pour vous assurer que le reste de votre programme ne s'en soucie pas. Cela fait partie de la façon dont KVO est mis en œuvre. La première fois que vous observez un objet avec KVO, sa classe passe à une sous-classe magique KVO qui modifie tous les accesseurs. Tout fonctionne bien, et vous ne remarquez même pas; mais je suis sûr que déboguer le code KVO * lui-même * est un divertissement au mieux. Pareil avec ton problème; documentez-le très bien ou vous ne vous souviendrez jamais de ce que vous faisiez. –