如何从同一对象中的静态方法调用非静态方法?从静态方法调用非静态方法Objective C
里面的静态方法: 如果我使用[ClassName nonStaticMethod]
或者 如果我使用[self nonStaticMethod]
我得到警告: 类方法“+ isTrancparentImageWithUrl:”未找到(返回类型默认为“身份证”)
如何从同一对象中的静态方法调用非静态方法?从静态方法调用非静态方法Objective C
里面的静态方法: 如果我使用[ClassName nonStaticMethod]
或者 如果我使用[self nonStaticMethod]
我得到警告: 类方法“+ isTrancparentImageWithUrl:”未找到(返回类型默认为“身份证”)
您需要创建类的对象来调用非类方法,您需要一个实例来调用这些方法,这就是为什么这些方法被称为实例方法的原因。
从类方法调用[self instanceMethod]
将不会工作,因为类方法中的self
指向类而不是任何实例。 Here你可以在类方法中找到有关self
的使用信息。
你不能
您可以在实例方法中调用静态方法/变量,但不能以其他方式调用。
原因很简单,静态方法绑定到类,而不是类的实例(对象)。
您可以创建当前类的实例,然后调用它,但不建议这样做。静态方法不能调用非静态方法 - 静态上下文中不存在“this”。
Objective-C没有静态方法。它有类方法。他们完全不同。 – bbum
Objective-C中没有static
方法。如果你想调用[Class method]
它被称为类方法
但是(在ANSI C的条件不是一成不变的),你可能会发现Singleton
模式有用:http://cocoadev.com/wiki/SingletonDesignPattern
(基本上,你持有一个对象的静态共享实例)
编辑: [ClassName instanceMethod]
- nonStaticMethod
没有为ClassName
定义。它被定义为ClassName
对象(实例),所以你不能使用它(它不存在),应用程序可能会崩溃。
[self instanceMethod]
- 你也不能使用它,因为当调用class方法时,没有self
--因为没有对象(实例)。你可以使用我上面发布的单例模式来解决它。
一个解决方案(和高度争议)的解决方案是将您的类转换为单例实现,然后将所有静态方法转换为常规方法。
例如,如果你有一个名为文件管理器和类在那里你必须看起来像
+ (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];
有几个原因,为什么你不希望创建一个单,但是,超出了我的回应:)的范围。
您需要创建一个实例。我相信它们在Objective-C –
中被称为类/实例方法不是静态/非静态的。 Objective-C没有静态方法。它有类方法。他们完全不同。 – bbum
这么多好的答案,我只能接受1 ...谢谢大家。 – Gal