Je comprends que remplacer une méthode en utilisant une catégorie est une pratique découragée. Néanmoins, je dois faire face à un code qui fait cela. Quand j'ai couru le code suivant, j'ai été surpris que ma méthode de catégorie soit appelée dans les deux cas, mais en pensant à la façon dont l'éditeur de liens doit prendre une décision au moment de la liaison pour un symbole donné. Ma question: En supposant qu'aucune autre catégorie ne soit en jeu autre que celles que je crée, suis-je assuré que l'implémentation dans ma catégorie sera toujours la logique qui est appelée tant que l'en-tête est importé de quelque part?Une méthode substituée dans une catégorie aura-t-elle toujours la priorité sur l'implémentation d'origine?
someObject.h
#import <Foundation/Foundation.h>
@interface SomeObject : NSObject
- (void)doSomething;
@end
someObject.m
#import "SomeObject.h"
@implementation SomeObject
- (void)doSomething
{
NSLog(@"Original");
}
@end
someObject + Cat.h
#import <Foundation/Foundation.h>
#import "SomeObject.h"
@interface SomeObject (SomeObject)
- (void)doSomething;
@end
someObject + Cat.m
#import "SomeObject+Cat.h"
@implementation SomeObject (SomeObject)
- (void)doSomething
{
NSLog(@"New!");
}
@end
someObjectUser.h
#import <Foundation/Foundation.h>
@interface SomeObjectUser : NSObject
- (void)useSomeObject;
@end
someObjectUser.m
#import "SomeObjectUser.h"
#import "SomeObject.h"
@implementation SomeObjectUser
- (void)useSomeObject
{
[[SomeObject new] doSomething];
}
@end
Test.m
- (void)testExample
{
[[SomeObject new] doSomething];
[[SomeObjectUser new] useSomeObject];
}
Résultat
2013-02-28 11:32:37.417 CategoryExample[933:907] New!
2013-02-28 11:32:37.419 CategoryExample[933:907] New!
@NikolaiRuhe Je ne suis pas d'accord, les questions sont fondamentalement différentes. –
@MikeD La question est un peu différente mais la réponse est valide pour les deux questions. – Sulthan
J'ai d'abord lu cette question et je peux maintenant voir comment il y a une réponse, mais le fait que le guide dise que le comportement indéfini est "moins susceptible d'être un problème" m'a fait me demander s'il y avait des idées supplémentaires ici. –