从目标 C 上的静态方法调用非静态方法



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

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

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

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

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

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

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

你不能

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

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

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

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

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

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

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

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

最新更新