【问题标题】:Why doesn't this method let me reference anything?为什么这种方法不能让我参考任何东西?
【发布时间】:2015-05-20 06:56:12
【问题描述】:

我最近创建了一个可以从其他类调用的方法,这是我的代码。

在 ViewController1.h 中

+ (void)updateName:(id)sender;

在 ViewController1.m 中

+ (void)updateName:(id)sender {

}

该方法正在调用和工作,这很好但是我在 ViewController1.m 文件中有另一个方法是

-(void)updateString {
        NSLog(@"IT WORKED");
}

但是,我尝试在我的 updateName 方法中这样调用它:

+ (void)updateName:(id)sender {
    [self updateString];
}

但我收到一条错误消息,提示“没有已知的选择器'updateString' 的类方法”谁能告诉我为什么会发生这种情况以及如何调用此方法?谢谢。

【问题讨论】:

  • 不能从类方法调用实例方法。
  • 建立在rmaddy的评论之上,+表示类方法,-表示实例方法,以防你不知道
  • @rmaddy +1 当然,您可以在类对象的方法中向实例对象发送消息。但是你不应该使用self。 ;-)
  • 有没有办法从类方法中调用实例方法,或者绕过它?
  • 那么一切都必须成为实例方法,并将ViewController1 的实例传递到您尝试访问它的任何地方,我猜您正在尝试设置您所在的视图控制器的文本即将继续?

标签: objective-c class methods viewcontroller


【解决方案1】:

方法前面的 + 表示类方法,即您无需创建 ViewController1 的新实例即可调用该方法。 [self updateString] 是一个实例方法,即您需要创建该类的一个新实例才能执行它。这里的问题是范围的差异。见下文:

在另一个类中:

[ViewController1 updateName:SOMETHING];

ViewController1 *newViewController1 = [[ViewController1 alloc] init];
[newViewController1 updateString];

编辑

如果你想从那个类中调用那个方法,你可以这样做吗?

+ (void)updateName:(id)sender {
    [ViewController1 updateString];
}

但这将无法引用或更新任何类属性等。因此,从您的方法名称来看,这可能无法解决您的问题。

这有意义吗?

【讨论】:

  • 好的,所以我想我理解你不能从类方法调用实例方法,但现在有没有办法绕过它以及如何从类方法调用实例方法?谢谢。
  • 你想做什么?这听起来像个问题。
  • 我正在尝试从不同的视图控制器更新视图控制器字符串,因此我需要能够从类方法中引用字符串和值。对这一挑战有任何帮助或解决方案吗?谢谢。
【解决方案2】:

您正在做一些奇怪的事情,但要解决您的问题,只需将方法名称前面的 - 替换为 +。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多