【问题标题】:Calling non static method from static method on Objective C从Objective C上的静态方法调用非静态方法
【发布时间】:2012-05-15 14:12:14
【问题描述】:

如何从同一对象中的静态方法调用非静态方法?

静态方法内部: 如果我使用[ClassName nonStaticMethod] 或者 如果我使用[self nonStaticMethod] 我收到警告: 找不到类方法'+isTrincparentImageWithUrl:'(返回类型默认为'id')

【问题讨论】:

  • 您需要创建一个实例。我相信它们在Objective-C中被称为类/实例方法而不是静态/非静态
  • 没错。 Objective-C 没有静态方法。它有类方法。它们完全不同。
  • 这么多好的答案,我只能接受1...谢谢大家。

标签: iphone objective-c static


【解决方案1】:

一个解决方案(也是极具争议的)解决方案是将您的类转换为单例实现,然后将所有静态方法转换为常规方法。

例如,如果你有一个名为 FileManager 的类,并且在其中你有一个看起来像

的方法
+ (NSString *) getDocumentsDirectory

无论出于何种原因,您想从内部调用一个非静态方法,您都需要将您的实现更改为这样的

+ (FileManager *)sharedInstance {
    // Singleton implementation
    static FileManager* instance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[FileManager alloc] init];
    });
    return instance;
}

- (NSString *) getDocumentsDirectory

而不是调用

[FileManager getDocumentsDirectory]; 

你会打电话给

[[FileManager sharedInstance] getDocumentsDirectory];

您不想创建单例有几个原因,但是,这超出了我的回复范围 :)。

【讨论】:

  • 谢谢,你说服我不要那样做 :)
  • @Gal:这实际上是一个合理的模式,而且一点也不 hacky。
  • 有几件事:1)在Objective-C中没有静态方法这样的东西; 2) 按照惯例,getter 方法永远不会以单词 get 为前缀。
  • @endy 有人在stackoverflow.com/questions/31426411/… 上复制了您的答案,声称这是他们自己的。
【解决方案2】:

你需要创建类的对象来调用非类方法,你需要一个实例来调用这些方法,这就是为什么这些方法被称为实例方法。

从类方法调用[self instanceMethod] 不起作用,因为类方法中的self 指向类而不是任何实例。 Here 你可以找到关于在类方法中使用self 的信息。

【讨论】:

    【解决方案3】:

    你不能

    您可以在实例方法中调用静态方法/变量,但不能以其他方式调用。

    原因很简单,静态方法绑定到类,而不是类的实例(对象)。

    【讨论】:

    • Objective-C 没有静态方法。它有类方法。它们完全不同。
    • 对,没注意到objective-c标签,抱歉。但就像这篇好帖子说的那样:stackoverflow.com/a/8089623/277370 -- 在日常编码中,没有太大区别,但有几个概念仍然不同,抱歉。
    • 只要您的日常工作不涉及子类化,我同意它不会产生巨大的影响。一旦您进入 API 设计或实现类层次结构,就会产生巨大的差异(请参阅类集群)。
    【解决方案4】:

    您可以创建当前类的实例,然后在其上调用它,但不建议这样做。静态方法不能调用非静态方法——静态上下文中没有“this”。

    【讨论】:

    • Objective-C 没有静态方法。它有类方法。它们完全不同。
    【解决方案5】:

    Objective-C 中没有static 方法。如果你想调用[Class method],它被称为类方法(在 ANSI C 中不是静态的)

    但是,您可能会发现 Singleton 模式很有用:http://cocoadev.com/wiki/SingletonDesignPattern

    (基本上,你持有一个对象的静态共享实例)

    编辑: [ClassName instanceMethod] - nonStaticMethod 没有为 ClassName 定义。它是为ClassName对象(实例)定义的,所以你不能使用它(它不存在),应用程序可能会崩溃。

    [self instanceMethod]- 你也不能使用它,因为在调用类方法时,没有self-因为没有对象(实例)。您可以使用我在上面发布的单例模式来解决它。

    【讨论】:

    • Objective-C 没有静态方法,它有 class 方法。它们由用于分派实例方法的相同机制动态分派,并且它们被子类继承(并且可以被覆盖),因此它们没有什么是静态的。
    • 是的,你是对的,但是对于来自其他语言的人来说,使用这个类比更容易,虽然不是 100% 正确,但可以理解。
    • 至少 100% 正确——这是错误的,除非你清楚地表明你在做一个类比。即便如此,我仍认为这是一个具有误导性的类比。 Objective-C 中静态方法的类似物是 C 函数,而不是类方法。
    • 好吧,我不是在这里使用类比的人 - 我的意思是 OP。在我看来,这很好。我可以看到您是基于 C 的程序员而不是基于 Java 的程序员。我相信当有人从java来到obj-c并要求static方法时,类方法就是他的意思。
    • 我相信我们在 Stackoverflow 上回答问题的职责之一是指出其他发帖者的错误假设。我不确定你所说的“基于 C 的程序员”是什么意思,但我实际上已经写了几本关于 Java 开发的书,所以我对这种语言并不完全陌生。同样,静态方法是 Java 的一个特性,而不是 Objective-C 的特性,如果不指出这一点,充其量只是一种误导。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多