【问题标题】:Objective-C: Instance method 'method' is being used on 'Class' which is not in the root classObjective-C:实例方法“方法”正在用于不在根类中的“类”
【发布时间】:2011-12-24 07:17:34
【问题描述】:

我收到警告:实例方法 'method' 正在用于不在根类中的 'Class'。

我在静态方法中调用这个方法(在超类中定义)。当我执行代码时,我得到运行时错误:unrecognized selector sent to class

这个问题能解决吗?是否可以在静态方法内部调用超类方法?

谢谢

编辑

儿童班:

@interface ProfileClass : GHAsyncTestCase {}
+ (void)testGHUnitSuccess;
@end

@implementation ProfileClass
+ (void)testGHUnitSuccess {
    [self waitForStatus:kGHUnitWaitStatusSuccess timeout:10.0];
}
@end

GHAsyncTestCase 是来自 GHUnit 框架的类。也许,在静态方法中无法调用超类方法。如果没有,我将不得不以不同的方式解决它。

解决方案

我已经创建了我的超类的共享实例并在静态方法中使用了它。

【问题讨论】:

  • 我们需要查看您的代码才能理解任何内容。

标签: objective-c static-methods superclass


【解决方案1】:

简单的答案是否定的。

要调用实例方法,您必须有一个要向其发送消息的类的实例。在静态方法中,您没有该类的实例。

因此,您要么需要将被调用的方法转换为静态方法 - 如果该方法不依赖于实例的任何值,或者您必须创建类的实例(alloc、init 等)静态方法。

如果不查看您的代码,我们无法提供更具体的出路。

编辑: 编辑后可以看出问题所在。
在类方法中(+ (void)testGHUnitSuccess - 注意不是静态方法) self 是没有实例方法的类。 因此,正如您所说,您需要将 self 替换为该类的实例 - 在本例中为共享实例。

【讨论】:

  • "在类方法中...... self 未定义,因此您正在向 nil 发送消息。"错误的。发给nil 的消息永远不会导致无法识别的选择器异常。而self定义在所有Objective-C方法中;在类方法中,self 是消息发送到的类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多