如何从同一对象中的静态方法调用非静态方法?
在静态方法内部:如果我使用[ClassName nonStaticMethod]
或如果我使用[self nonStaticMethod]
我会收到警告:找不到类方法'+isTrancparentImageWithUrl:'(返回类型默认为'id')
如何从同一对象中的静态方法调用非静态方法?
在静态方法内部:如果我使用[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
因为没有对象(实例)。您可以使用我在上面发布的单例模式来解决它。