2012-05-15 77 views
4

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

里面的静态方法: 如果我使用[ClassName nonStaticMethod] 或者 如果我使用[self nonStaticMethod] 我得到警告: 类方法“+ isTrancparentImageWithUrl:”未找到(返回类型默认为“身份证”)

+5

您需要创建一个实例。我相信它们在Objective-C –

+2

中被称为类/实例方法不是静态/非静态的。 Objective-C没有静态方法。它有类方法。他们完全不同。 – bbum

+0

这么多好的答案,我只能接受1 ...谢谢大家。 – Gal

回答

3

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

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

1

你不能

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

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

+1

Objective-C没有静态方法。它有类方法。他们完全不同。 – bbum

+0

没错,没有注意到objective-c标签,对不起。但就像这个好帖子所说:http://stackoverflow.com/a/8089623/277370 - 在日复一日的编码中,没有太大的区别,但是一些概念仍然不同,对不起。 – allaire

+0

只要你的日常工作不涉及子类化,我同意它没有太大的区别。一旦进入API设计或实现类层次结构,它就会产生巨大的差异(请参见Class Clusters)。 – bbum

0

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

+1

Objective-C没有静态方法。它有类方法。他们完全不同。 – bbum

0

Objective-C中没有static方法。如果你想调用[Class method]它被称为类方法

但是(在ANSI C的条件不是一成不变的),你可能会发现Singleton模式有用:http://cocoadev.com/wiki/SingletonDesignPattern

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

编辑: [ClassName instanceMethod] - nonStaticMethod没有为ClassName定义。它被定义为ClassName对象(实例),所以你不能使用它(它不存在),应用程序可能会崩溃。

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

+1

Objective-C没有静态方法,它有* class *方法。它们由用于分派实例方法的相同机制动态分派,并且它们被子类继承(并且可以被覆盖),所以它们没有任何静态的。 – jlehr

+0

是的,你是对的,但对于来自另一种语言的人来说,使用这种比喻更容易,这是可以理解的,尽管不是100%正确的。 –

+0

它不小于100%正确 - 这是错误的,除非你清楚地声明你正在画一个类比。即便如此,我认为这是一种误导性的类比。 Objective-C中静态方法的类比是C函数,而不是类方法。 – jlehr

6

一个解决方案(和高度争议)的解决方案是将您的类转换为单例实现,然后将所有静态方法转换为常规方法。

例如,如果你有一个名为文件管理器和类在那里你必须看起来像

+ (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]; 

有几个原因,为什么你不希望创建一个单,但是,超出了我的回应:)的范围。

+0

谢谢,你说服我不要这样:) – Gal

+2

@Gal:它实际上是一个合理的模式,而不是哈克。 – JeremyP

+1

几件事情:1)Objective-C中没有静态方法; 2)按照惯例,getter方法永远不会以“get”这个词作为前缀。 – jlehr