关于iphone:在Objective C上从静态方法调用非静态方法

Calling non static method from static method on Objective C

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

静态方法内部:如果我使用[ClassName nonStaticMethod]。或如果我使用[self nonStaticMethod]。我得到警告:类方法"+IStrancParentImageWithURL:"未找到(返回类型默认为"ID")。


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

例如,如果您有一个名为FileManager的类,并且在其中有一个方法

1
+ (NSString *) getDocumentsDirectory

无论出于什么原因,您想从内部调用一个非静态方法,您都需要将您的实现更改为类似这样的东西。

1
2
3
4
5
6
7
8
9
10
11
+ (FileManager *)sharedInstance {
    // Singleton implementation
    static FileManager* instance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[FileManager alloc] init];
    });
    return instance;
}

- (NSString *) getDocumentsDirectory

而不是打电话

1
[FileManager getDocumentsDirectory];

你会打电话

1
[[FileManager sharedInstance] getDocumentsDirectory];

但是,有几个原因可以解释为什么您不想创建单例,这超出了我的回答范围:)。


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

从类方法调用[self instanceMethod]是行不通的,因为类方法中的self指向的是类,而不是任何实例。在这里,您可以找到有关在类方法中使用self的信息。


你不能

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

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


在objective-c中没有static方法。如果要调用[Class method]方法,则称为类方法(在ansi c中不是静态的)。

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

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

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

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


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