我可以检测到:“基类的类重载方法”吗?

时间:2015-10-14 14:13:06

标签: objective-c oop runtime override nsobject

我班上有两种方法

- (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]) {

    }
}

但我找不到任何解决方案(在documentation / google / stackoverflow中)。并且无法处理:“开发人员是否重载基类的方法”。

可能有更好的解决方案。但我认为它应该是最好的。如果你有其他想法。请写下bellow =)

我找到了唯一的方法:+[NSObject instancesRespondToSelector]当然我知道-[NSObject respondsToSelector:]但是你知道它总是返回YES。我需要几乎相同,但对于当前类忽略基础。

PS。谢谢你的关注。链接到文档或某些文章将非常有帮助。

2 个答案:

答案 0 :(得分:2)

可能它并不完全是你所要求的,但当我需要确定子类超载一些必需的方法时,我会这样做:

@protocol SomeClassRequiredOverload

- (void) someMethodThatShouldBeOverloaded;

@end

@interface _SomeClass
@end

typedef _SomeClass<SomeClassRequiredOverload> SomeClass;

答案 1 :(得分: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中检查您需要的所有内容。它为类调用一次(所以它不会占用很多CPU时间)。它只需要开发人员。所以添加#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
    }
}

胜利!