【问题标题】:Objective C: Is there a way to call class methods on a class object without compiler complaints?目标 C:有没有办法在没有编译器投诉的情况下调用类对象上的类方法?
【发布时间】:2011-11-04 14:35:03
【问题描述】:

如果你有一个类对象,有没有办法使用它来调用该类的类方法。例如,如果您定义了带有方法 + (void)foo 的 A 类,那么您如何在没有编译器警告它找不到方法 foo 的情况下实现以下示例的功能:

A* object = [[A alloc] init];
id objectClass = [object class];
[objectClass foo]; // complains that the method is not found

【问题讨论】:

  • 请发布实际的接口文件 (.h)、进行此调用的代码以及实际的编译器输出。这应该有效。
  • 确保在 interfaceimplementation 中在方法 foo 之前都有 +
  • 抱歉我发的太匆忙了。请参阅上面的修改。

标签: iphone objective-c ios class methods


【解决方案1】:

在你的 .h 中创建一个类方法:

MyClass.h

@interface MyClass : NSObject {    
}
+(void) test;

@end

MyClass.m

@implementation MyClass

-(id) init
{
    self = [super init];

    return self;
}

+(void) test
{
    NSLog(@"Test executed");
}

@end

你可以这样称呼它:

MyClass* myClass = [[[MyClass alloc] init] autorelease];

[[myClass class] test];

编辑:

如果问题是编译器警告,只需创建一个 @protocol 来定义您要调用的 foo 方法。 而不是调用:

id objectClass = [object class]; 

试试这个;

id<MyProtocol> myCastedObject = (id<MyProtocol>)object;
[myCastedObject class] foo];

【讨论】:

    【解决方案2】:

    您不必创建实例来调用类方法。如果必须调用实例方法,则创建实例。

    A 类的方法 + (void)foo 应该被称为,

    [A foo];
    

    【讨论】:

      【解决方案3】:

      我刚刚使用我的一个类进行了快速测试,并且能够使用您的语法使其工作。 你得到什么错误? 顺便说一句,你基本上在做的是

        [A foo];
      

      调用类的静态成员。这仅适用于使用 + 号标记为静态的方法。

      【讨论】:

      • 对不起,我发布得太早了。我最终的问题是如何让编译器不抱怨。请在上面查看我的编辑
      • 啊,当我做测试时,我使用了类名而不是objectClass,你为什么不这样做呢?或者只是做上面的一个班轮?
      • 我给出的例子是人为的,而不是我真正想要做的。在我的实际代码中,我有一组不同的类对象,我必须调用类方法,因此不能使用类名。
      • 我唯一能想到的就是创建一个具有您的常用方法的类(假设您有常用方法)并用您当前的类继承它,那么您可以作为该类访问您的对象吗?跨度>
      • 它们是类方法,不是静态方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      • 1970-01-01
      相关资源
      最近更新 更多