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

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


当前回答

所有的技术细节都已经在其他答案中很好地涵盖了。我只是想分享一个简单的类比,我认为它很好地说明了类和实例之间的区别:

类就像房子的蓝图:你只有一个蓝图,(通常)你不能单独用蓝图做那么多。

实例(或对象)是您根据蓝图构建的实际房屋:您可以从相同的蓝图构建许多房屋。然后,您可以为每个房子的墙壁涂上不同的颜色,就像您可以独立地更改类的每个实例的属性而不影响其他实例一样。

其他回答

与大多数其他答案一样,实例方法使用类的实例,而类方法可以只使用类名。在Objective-C中,它们的定义如下:

@interface MyClass : NSObject

+ (void)aClassMethod;
- (void)anInstanceMethod;

@end

它们可以这样使用:

[MyClass aClassMethod];

MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];

一些真实世界的类方法的例子是许多基础类的方便方法,如NSString的+stringWithFormat:或NSArray的+arrayWithArray:。实例方法是NSArray的-count方法。

所有的技术细节都已经在其他答案中很好地涵盖了。我只是想分享一个简单的类比,我认为它很好地说明了类和实例之间的区别:

类就像房子的蓝图:你只有一个蓝图,(通常)你不能单独用蓝图做那么多。

实例(或对象)是您根据蓝图构建的实际房屋:您可以从相同的蓝图构建许多房屋。然后,您可以为每个房子的墙壁涂上不同的颜色,就像您可以独立地更改类的每个实例的属性而不影响其他实例一样。

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

在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];

补充上述答案

Class方法将在Class上工作,我们将它用于一般用途,如+stringWithFormat,类的大小,最重要的是用于init等

NSString *str = [NSString stringWithFormat:@"%.02f%%",someFloat]; 

实例方法对一个类的实例起作用,而不是对一个类起作用,比如我们有两个人,我们想知道每个人的余额,这里我们需要使用实例方法。因为它不会返回一般响应。例如,确定NSSArray的计数等。

[johnson getAccountBalance];
[ankit getAccountBalance];