4

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

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

4

5 回答 5

7

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

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

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

于 2012-05-15T14:21:15.393 回答
3

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

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

于 2012-05-15T14:22:36.910 回答
1

你不能

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

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

于 2012-05-15T14:13:21.867 回答
0

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

于 2012-05-15T14:13:45.177 回答
0

Objective-C中没有static方法。如果要调用[Class method]它,则称为类方法(就 ANSI C 而言不是静态的)

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

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

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

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

于 2012-05-15T14:15:40.320 回答