在可能未知的类(iOS)上调用类方法

在可能未知的类(iOS)上调用类方法,ios,class,methods,Ios,Class,Methods,假设我有一个特定的对象类,它定义了一个类方法,返回关于该类的简单信息,因此: + (NSInteger) defaultValueForClass { return 5; } 现在,假设我有一系列子类,每个子类都重写这个方法以提供不同的信息。我的问题是:在不知道具体的子类正在被操作的情况下,如何调用该类方法,从而使用相关的子类方法?我不能简单地去: [[anObject class] defaultValueForClass] …因为编译器现在还不知道我的自定义子类方法。很抱歉我之前

假设我有一个特定的对象类,它定义了一个类方法,返回关于该类的简单信息,因此:

+ (NSInteger) defaultValueForClass {
    return 5;
}
现在,假设我有一系列子类,每个子类都重写这个方法以提供不同的信息。我的问题是:在不知道具体的子类正在被操作的情况下,如何调用该类方法,从而使用相关的子类方法?我不能简单地去:

[[anObject class] defaultValueForClass]

…因为编译器现在还不知道我的自定义子类方法。

很抱歉我之前的帖子,我错了,只需定义一个协议,然后检查您的类是否符合StopRotocol,或者检查给定的类isSubclassOfClass是否适合我

// car.m
#import <Foundation/Foundation.h>

@interface Car : NSObject
+ (void)make;
@end

@interface Honda : Car
@end

@interface Porsche : Car
@end

@implementation Car
+ (void)make { NSLog(@"generic"); }
@end

@implementation Honda
+ (void)make { NSLog(@"Honda"); }
@end

@implementation Porsche
+ (void)make { NSLog(@"Porsche"); }
@end

int main() {
    Porsche *porsche = [[Porsche alloc] init];
    [[porsche class] make];

    Car *supercar = (Car *)[[Honda alloc] init];
    [[supercar class] make];

    return 0;
}
编译和执行输出没有显示错误或警告

$ clang -framework foundation car.m -o car.o $ ./car.o 2012-07-01 01:53:46.559 car.o[8127:707] Porsche 2012-07-01 01:53:46.561 car.o[8127:707] Honda
您使用的是什么版本的Xcode和GCC?它是旧的GCC还是LLVM-GCC?

它将在运行时知道类的类型这不是它在运行时知道什么的问题,而是让编译器明白这些代码是有效的,这样项目将首先编译。XCode 4.3你知道,最奇怪的事情,我完全按照我第一次实现的方式重写了代码,它开始给出一个完全不同的警告!当我执行Moxy提出的制定协议的建议时,这一点立即得到了解决。这似乎已经解决了问题,尽管我看到的最初错误实际上是Xcode的某种错误。好像。。。这听起来很奇怪,但是。。。在类被编译之前,它不会识别类名,但项目本身永远不会编译,因为类名无法识别。通过删除对[class classMethod]的调用并构建,编译器识别出该方法。替换代码后,只运行粗略的警告,这些警告通过添加协议被清除。