【问题标题】:Calling Class method on a potentially unknown class (iOS)在可能未知的类上调用 Class 方法 (iOS)
【发布时间】:2012-07-01 08:27:23
【问题描述】:

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

+ (NSInteger) defaultValueForClass {
    return 5;
}

现在,假设我有一系列子类,每个子类都覆盖此方法以提供不同的信息。我的问题是:如何在不知道正在执行哪个具体子类的情况下调用该类方法,从而使用相关的子类方法?我不能简单地去:

[[anObject class] defaultValueForClass]

...因为此时编译器不知道我的自定义子类方法。

【问题讨论】:

  • 它会在运行时知道类的类型
  • 这不是它在运行时知道什么的问题,而是让编译器明白这段代码是有效的,以便项目首先编译的问题。

标签: ios class methods


【解决方案1】:

对不起我之前的帖子,我错了,只需定义一个协议然后检查你的类是否符合ToProtocol,或者检查给定的类是否为“isSubclassOfClass”

【讨论】:

  • 这似乎已经解决了问题,尽管看起来我收到的原始错误实际上是 Xcode 的某种错误。好像......这听起来很奇怪但是......在类被编译之前它不会识别类名,但是项目本身永远不会编译,因为类名未被识别。通过删除对 [class classMethod] 的调用并构建,编译器识别了该方法。替换代码然后运行,只有通过添加协议清除的粗略警告。
【解决方案2】:

为我工作。

// 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 基础 car.m -o car.o $ ./car.o 2012-07-01 01:53:46.559 car.o[8127:707] 保时捷 2012-07-01 01:53:46.561 car.o[8127:707] 本田

您使用的是哪个版本的 Xcode 和 GCC?是旧的 GCC 还是 LLVM-GCC?

【讨论】:

  • XCode 4.3 你知道,最奇怪的是,我完全按照我第一次实现它的方式重写了代码,它开始发出完全不同的警告!当我实施 Moxy 提出的制定协议的建议时,这一点立即得到了解决。
猜你喜欢
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
相关资源
最近更新 更多