Calling non static method from static method on Objective C
如何从同一对象中的静态方法调用非静态方法?
静态方法内部:如果我使用[ClassName nonStaticMethod]。或如果我使用[self nonStaticMethod]。我得到警告:类方法"+IStrancParentImageWithURL:"未找到(返回类型默认为"ID")。
- 您需要创建一个实例。我相信它们被称为类/实例方法,而不是Objective-C中的静态/非静态方法
- 确切地.Objective-C没有静态方法。它有类方法。它们完全不同。
- 这么多好的答案,我只能接受1…谢谢大家。
一个解决方案(也是备受争议的)是将类转换为单例实现,然后将所有静态方法转换为常规方法。
例如,如果您有一个名为FileManager的类,并且在其中有一个方法
1
| + (NSString *) getDocumentsDirectory |
无论出于什么原因,您想从内部调用一个非静态方法,您都需要将您的实现更改为类似这样的东西。
1 2 3 4 5 6 7 8 9 10 11
| + (FileManager *)sharedInstance {
// Singleton implementation
static FileManager* instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[FileManager alloc] init];
});
return instance;
}
- (NSString *) getDocumentsDirectory |
而不是打电话
1
| [FileManager getDocumentsDirectory]; |
你会打电话
1
| [[FileManager sharedInstance] getDocumentsDirectory]; |
但是,有几个原因可以解释为什么您不想创建单例,这超出了我的回答范围:)。
- 谢谢,你说服我不要那样做:)
- @盖尔:这实际上是一个合理的模式,一点也不刻薄。
- 有两件事:1)在objective-c中没有静态方法;2)按照惯例,getter方法从来没有前缀为get这个词。
- @endy有人在stackoverflow.com/questions/31426411/hellip;上复制了您的答案,并声称是自己的答案。
您需要创建类的对象来调用非类方法,您需要一个实例来调用此类方法,这就是为什么这些方法被称为实例方法的原因。
从类方法调用[self instanceMethod]是行不通的,因为类方法中的self指向的是类,而不是任何实例。在这里,您可以找到有关在类方法中使用self的信息。
你不能
您可以在实例方法中调用静态方法/变量,但不能以另一种方式调用。
原因很简单,静态方法绑定到类,而不是类的实例(对象)。
- Objective-C没有静态方法。它有类方法。它们完全不同。
- 对,没注意到目标C标签,对不起。但是就像这篇好文章所说的:stackoverflow.com/a/8089623/277370——在日常编码中,没有太大的区别,但是有几个概念仍然不同,抱歉。
- 只要您的日常工作不涉及子类化,我同意它不会有很大的区别。一旦你进入API设计或实现一个类层次结构,它就会产生巨大的差异(参见类集群)。
在objective-c中没有static方法。如果要调用[Class method]方法,则称为类方法(在ansi c中不是静态的)。
但是,您可能会发现Singleton模式很有用:http://cocadev.com/wiki/singletondesignpattern
(基本上,您持有对象的静态共享实例)
编辑:[ClassName instanceMethod]—nonStaticMethod没有为ClassName定义。它是为ClassName对象(实例)定义的,因此您不能使用它(它不存在),应用程序可能会崩溃。
[self instanceMethod]—也不能使用它,因为在调用类方法时,没有self—因为没有对象(实例)。你可以使用我上面发布的单例模式来解决这个问题。
- Objective-C没有静态方法,它有类方法。它们是由用于调度实例方法的相同机制动态调度的,并且它们是由子类继承(并且可以被重写)的,因此它们没有任何静态特性。
- 是的,你是对的,但是对于来自另一种语言的人来说,使用这个类比更容易,这是可以理解的,尽管不是100%正确。
- 它不低于100%是正确的——它是错误的,除非你清楚地表明你在做一个类比。即便如此,我还是认为这是一个误导性的类比。Objective-C中静态方法的类似物是C函数,而不是类方法。
- 好吧,我不是这里使用类比的那个人——我是说操作,在我看来这很好。我可以看出,你是一个相当基于C的程序员,而不是基于Java的程序员。我相信当有人从Java到Obj-C并要求EDCOX1×0方法时,类方法就是他的意思。
- 我相信我们在回答StackOverflow问题时的职责之一是指出其他海报部分的错误假设。我不确定你所说的"基于C的程序员"是什么意思,但实际上我已经写了几本关于Java开发的书,所以我对语言并不完全陌生。同样,静态方法是Java的一个特性,而不是Objto-C,并且它最好是误导性的,而不是指出这一点。
您可以创建当前类的实例,然后调用它,但不建议这样做。静态方法不能调用非静态方法-静态上下文中没有"this"。
- Objective-C没有静态方法。它有类方法。它们完全不同。