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