我班上有两种方法
- (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。谢谢你的关注。链接到文档或某些文章将非常有帮助。
答案 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
}
}
胜利!