Difference between class methods and instance methods?
当我在编程中使用实例方法和类方法时,我总是搞混了。请告诉我实例方法和类方法的区别以及它们之间的优点。
所有其他的答案似乎都被错误的标签发现了,这个标签现在已经被修正了。
在Objective-C中,实例方法是当消息发送到类的实例时调用的方法。例如:
1 2 3 | id foo = [[MyClass alloc] init]; [foo someMethod]; // ^^^^^^^^^^ This message invokes an instance method. |
在Objective-C中,类本身就是对象,而类方法只是在消息发送到类对象时调用的方法。即
1 2 | [MyClass someMethod]; // ^^^^^^^^^^ This message invokes a class method. |
请注意,在上面的示例中,选择器是相同的,但因为在一种情况下,它被发送到MyClass的实例,而在另一种情况下,它被发送到MyClass,所以会调用不同的方法。在接口声明中,可以看到:
1 2 3 4 5 6 7 8 | @interface MyClass : NSObject { } +(id) someMethod; // declaration of class method -(id) someMethod; // declaration of instance method @end |
在实施过程中
1 2 3 4 5 6 7 8 9 10 11 12 | @implementation MyClass +(id) someMethod { // Here self is the class object } -(id) someMethod { // here self is an instance of the class } @end |
编辑
对不起,错过了第二部分。没有这样的优点或缺点。这就像是在问"当"和"如果"之间的区别,以及两者之间的优势是什么。这有点毫无意义,因为它们是为不同的目的而设计的。
类方法的最常见用法是在需要实例时获取实例。
另一个常见的用途是获得单子,例如
1 2 3 4 5 6 7 8 9 | +(MyClass*) myUniqueObject { static MyUniqueObject* theObject = nil; if (theObject == nil) { theObject = [[MyClass alloc] init]; } return theObject; } |
上面的方法也可以作为实例方法使用,因为对象是静态的。但是,如果将其作为类方法,并且不必首先创建实例,那么语义就更清晰了。
如果我们不想创建类的对象,那么我们使用类方法如果我们想通过类的对象调用方法,那么我们使用实例方法
我不知道我们是否可以谈论任何优势,这是一个相当于你正在实施的问题。
实例方法应用于类的实例,因此它们需要应用对象,并且可以访问调用方的成员:
1 2 | Foo bar; bar.instanceMethod(); |
另一方面,类方法应用于整个类,它们不依赖任何对象:
1 | Foo::classMethod(); |
正如大多数其他答案所说,实例方法使用类的实例,而类方法只能与类名一起使用。在目标C中,它们被定义为:
1 2 3 4 5 6 | @interface MyClass : NSObject + (void)aClassMethod; - (void)anInstanceMethod; @end |
然后可以这样使用它们:
1 2 3 4 5 6 | // class methods must be called on the class itself [MyClass aClassMethod]; // instance method require an instance of the class MyClass *object = [[MyClass alloc] init]; [object anInstanceMethod]; |
类方法的一些实际例子是许多基础类的便利方法,如EDCOX1、1的EDOCX1、2或EDCOX1、3的EDCOX1、4、4。实例方法是
实例方法使用类的实例,而类方法只能与类名一起使用。+符号在类方法之前使用,其中as single desh(-)在实例变量之前使用。
1 2 3 4 5 6 | @interface MyClass : NSObject + (void)aClassMethod; - (void)anInstanceMethod; @end |
它们也可以这样使用,
1 2 3 4 | [MyClass aClassMethod]; MyClass *object = [[MyClass alloc] init]; [object anInstanceMethod]; |
或者另一个例子是:
[
1 2 3 4 | NSString string]; //class method NSString *mystring = [NSString alloc]init]; [mystring changeText]; //instance Method |
类方法用于类,但实例方法用于该类的对象,即实例
1 2 3 4 5 6 | //Class method example className *objectName = [[className alloc]init]; [objectName methodName]; //Instance method example [className methodName]; |
读一读静态关键字,它几乎涵盖了它。
MSDN:http://msdn.microsoft.com/en-us/library/s1sb61xd.aspx
谷歌搜索:http://www.google.ch/search?aq=f&sourceid=chrome&ie=utf-8&q=static+keyword+c%2b%2b
静态成员函数被非正式地称为类方法(不正确)。在C++中没有方法,有成员函数。