在Objective C上从静态方法调用非静态方法

时间:2012-05-15 14:12:14

标签: iphone objective-c static

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

静态方法内: 如果我使用[ClassName nonStaticMethod] 要么 如果我使用[self nonStaticMethod] 我收到警告: 未找到类方法'+ isTrancparentImageWithUrl:'(返回类型默认为'id')

5 个答案:

答案 0 :(得分:6)

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

如果您有一个名为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];

有几个原因可以解释为什么你不想创建一个单例,但这超出了我的响应范围:)。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

你不能

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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

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

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