En bref, vous ne pouvez pas.
Vous pouvez en Objective-C 1.0 ABI/API via:
OBJC_EXPORT void class_removeMethods(Class, struct objc_method_list *) OBJC2_UNAVAILABLE;
Mais cette fonction a été supprimée en Objective-C 2.0, car la suppression des méthodes est à peu près jamais la bonne réponse. Certainement pas assez souvent pour justifier les frais généraux encourus en supportant cette fonctionnalité.
Également supprimé de l'ObjC2.0 ABI était la possibilité d'accéder directement aux structures de classe/méthode. Ils sont maintenant opaques de sorte qu'ils peuvent être changés dans le futur sans casser la compatibilité binaire.
Toutefois, vous pouvez utiliser un proxy personnalisé qui varie l'ensemble des méthodes auxquelles il répond. Voir la documentation pour la classe NSProxy; http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSProxy_Class/Reference/Reference.html
Bien sûr, cette question soulève la question "Qu'est-ce que vous essayez de faire?". Une telle méta-programmation à la volée est atypique. Une fois qu'une classe est instanciée, il n'est normalement pas considéré souhaitable de changer l'ensemble de méthodes auxquelles elle répond en supposant que les instanciations précédentes peuvent toujours dépendre desdites méthodes.
La réponse au "pourquoi" est que je suis intéressé à écrire du code qui montrera ce qui se passe quand KVC est utilisé. En ajoutant et en supprimant des méthodes à l'exécution, je pourrais permettre à l'utilisateur d'explorer l'effet de la présence de diverses combinaisons de méthodes. J'ai conclu que le seul moyen de le faire est de se débrouiller avec les internes; et Objective-C 2.0 met un terme à cela par tous les moyens sauf le hackery. –
Peut-être un peu en retard, mais: Peut-être que dans votre exemple, vous pourriez créer des sous-classes dynamiques à l'exécution qui répondent aux méthodes que vous voulez. Au lieu de supprimer une méthode, vous pouvez simplement créer une nouvelle sous-classe de votre classe de base qui n'a pas cette méthode. –
Un autre cas où la suppression d'une méthode est nécessaire: Dans les tests unitaires, vous devez parfois remplacer des méthodes dans des classes existantes. Le framework OCMock vous permet de le faire, mais OCMock lui-même a du mal à restaurer la classe après un test individuel car il ne peut pas supprimer les méthodes. Il peut remplacer le IMP d'une méthode existante avec le stub, mais si la méthode était dans une classe parent, il doit ajouter le stub dans la sous-classe et ne peut pas s'en débarrasser. Donc, pour répondre à la "Qu'est-ce que vous essayez de faire?" question: je reçois totalement un "logiciel opiniâtre" mais à mon avis, le runtime d'Apple ne devrait pas l'être. –