类方法和实例方法的区别是什么?

实例方法是访问器(getter和setter),而类方法几乎是其他所有东西吗?


当前回答

类方法

是声明为静态的方法。可以在不创建类实例的情况下调用该方法。类方法只能操作类成员,而不能操作实例成员,因为类方法不知道实例成员。类的实例方法也不能从类方法内部调用,除非在该类的实例上调用它们。

实例方法

另一方面,需要类的实例存在才能调用它们,因此需要使用new关键字创建类的实例。实例方法操作于类的特定实例。实例方法没有被声明为静态的。

其他回答

类方法不能改变或知道任何实例变量的值。这应该是判断实例方法是否可以是类方法的标准。

类方法通常用于创建该类的实例

例如,[NSString stringWithFormat:@"SomeParameter"];返回一个带参数的NSString实例。因此,因为它是一个返回其类型的对象的Class方法,所以它也被称为方便方法。

实例方法应用于类的实例(即对象),而类方法应用于类本身。

在c#中,类方法被标记为静态。未标记为static的方法和属性是实例方法。

class Foo {
  public static void ClassMethod() { ... }
  public void InstanceMethod() { ... }
}

在Objective-C中,所有方法都以“-”或“+”字符开头。 例子:

@interface MyClass : NSObject
// instance method
- (void) instanceMethod;

+ (void) classMethod;
@end

“+”和“-”字符分别指定方法是类方法还是实例方法。

如果我们调用这些方法,区别就很明显了。这里的方法是在MyClass中声明的。

实例方法需要类的实例:

MyClass* myClass = [[MyClass alloc] init];
[myClass instanceMethod];

在MyClass内部,其他方法可以使用self调用MyClass的实例方法:

-(void) someMethod
{
    [self instanceMethod];
}

但是,类方法必须在类本身上调用:

[MyClass classMethod];

Or:

MyClass* myClass = [[MyClass alloc] init];
[myClass class] classMethod];

这行不通:

// Error
[myClass classMethod];
// Error
[self classMethod];

你的问题的答案并不特定于objective-c,但是在不同的语言中,类方法可能被称为静态方法。

类方法和实例方法之间的区别是

类方法

操作Class变量(它们不能访问实例变量) 不需要一个对象被实例化应用 有时可能是一种代码气味(一些刚接触OOP的人把它作为在面向对象环境中进行结构化编程的拐杖)

实例方法

操作实例变量和类变量 必须对一个实例化对象进行操作