2015-10-14 1 views
2

У меня есть два метода в моем классеМогу ли я обнаружить: «Является ли метод перегрузки класса базового класса»?

- (void)configureWithDictionary:(NSDictionary*)dictionary; 
- (void)configureWithDictionary:(NSDictionary*)dictionary withOptions:(XWTreeItemConvertationToNSDictionaryOption*)options; 

И у меня есть реализация для них обоих. Так! Решение, как: «Просто добавьте NSAssert (NO, @» Вы тучную переопределить этот метод «)» не поможет = (

- (void)configureWithDictionary:(NSDictionary*)dictionary withOptions:(XWTreeItemConvertationToNSDictionaryOption*)options; 
{ 
    NSAssert(NO, @"You mast override this method" 
} 

Потому что у меня есть некоторый код, туда и нужно писать [super configureWithDictionary:dictionary withOptions:options]; в перегруженном методе .. Все могут использовать эти методы, но мне нужны оба! Но

Если какой-либо разработчик перегрузится -[MYClass configureWithDictionary:], он может «работать некорректно». Просто потому, что этот метод не вызывает времени. Поэтому мне нужно что-то написать на консоли. Например: «Пожалуйста, перегрузите метод: -[MYClass configureWithDictionary:withOptions:]». И я хочу обрабатывать его только один раз в этом методе:

+ (void)initialize 
{ 
    if (self == [self class]) { 

    } 
} 

Но я не могу найти решение (в документации/google/stackoverflow). И не может обработать: «Использует ли разработчик метод перегрузки базового класса».

Может быть, есть лучшее решение. Но я думаю, что это должно быть лучше. Если у вас есть другие идеи. Пожалуйста, напишите bellow =)

Я нашел только метод: +[NSObject instancesRespondToSelector] и, конечно, знаю о -[NSObject respondsToSelector:], но, как вы знаете, он всегда возвращает ДА. Мне нужно почти то же самое, но для текущего класса, игнорирующего базу.

PS. В любом случае спасибо за внимание. Ссылка на документацию или какую-то статью будет очень полезной.

ответ

0

Я нашел решение сам, и я думаю, что это может помочь сообществу. Итак, 3 простых шага.

Шаг 1: Создание категории формы NSObject методом

+ (NSArray*)methodNamesForClass_WithoutBaseMethodsClasses 
{ 
    unsigned int methodCount = 0; 
    Method *methods = class_copyMethodList(self, &methodCount); 
    NSMutableArray *array = [NSMutableArray arrayWithCapacity:methodCount]; 
    for (unsigned int i = 0; i < methodCount; i++) { 
     Method method = methods[i]; 
     [array addObject:[NSString stringWithFormat:@"%s", sel_getName(method_getName(method))]]; 
    } 
    free(methods); 
    return [array copy]; 
} 

Шаг 2: Проверка делает вам класс перегружает некоторый метод:

[[self methodNamesForClass_WithoutBaseMethodsClasses] containsObject:NSStringFromSelector(@selector(configureWithDictionary:))] 

Шаг 3: Проверьте все, что вам нужно в + (void)initialize. Он называется один раз для класса (так что это не будет много процессорного времени). И это нужно только для разработчиков. So Add #ifdef DEBUG директива

+ (void)initialize 
{ 
    if (self == [self class]) { 
#ifdef DEBUG 
     if ([[self methodNamesForClass_WithoutBaseMethodsClasses] containsObject:NSStringFromSelector(@selector(configureWithDictionary:))] && ![[self methodNamesForClass_WithoutBaseMethodsClasses] containsObject:NSStringFromSelector(@selector(configureWithDictionary:withOptions:))]) { 
      NSAssert(NO, @"Please override method: -[%@ %@]", NSStringFromClass([self class]), NSStringFromSelector(@selector(configureWithDictionary:withOptions:))); 
     } 
#endif 
    } 
} 

Победа!

2

Может быть, это не совсем то, что вы просите, но когда я должен быть уверен, что дочерние классы перегружать некоторые необходимый метод я сделать такую ​​вещь:

@protocol SomeClassRequiredOverload 

- (void) someMethodThatShouldBeOverloaded; 

@end 

@interface _SomeClass 
@end 

typedef _SomeClass<SomeClassRequiredOverload> SomeClass; 
+0

Это хороший трюк. Я буду использовать его в своей работе. Спасибо =)! Но это не поможет найти проблему для иностранного разработчика. Sad = ( – ZevsVU

+0

Это решение выгодно проверять на + инициализацию, потому что он не сможет скомпилировать, а не прервать во время выполнения. Ошибка компиляции подскажет пользователю, что именно делать. –