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

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


当前回答

就像其他答案所说的,实例方法操作对象并可以访问它的实例变量,而类方法操作整个类,并且不能访问特定实例的变量(除非您将实例作为参数传入)。

类方法的一个很好的例子是计数器类型方法,它返回类实例的总数。类方法以“+”开头,而实例方法以“-”开头。 例如:

static int numberOfPeople = 0;

@interface MNPerson : NSObject {
     int age;  //instance variable
}

+ (int)population; //class method. Returns how many people have been made.
- (id)init; //instance. Constructs object, increments numberOfPeople by one.
- (int)age; //instance. returns the person age
@end

@implementation MNPerson
- (id)init{
    if (self = [super init]){
          numberOfPeople++;
          age = 0;
    }    
    return self;
}

+ (int)population{ 
     return numberOfPeople;
}

- (int)age{
     return age;
}

@end

main.m:

MNPerson *micmoo = [[MNPerson alloc] init];
MNPerson *jon = [[MNPerson alloc] init];
NSLog(@"Age: %d",[micmoo age]);
NSLog(@"%Number Of people: %d",[MNPerson population]);

输出: 年龄:0 人数:2人

另一个例子是,如果你有一个方法,你想让用户能够调用,有时把它变成一个类方法是很好的。例如,如果你有一个叫MathFunctions的类,你可以这样做:

+ (int)square:(int)num{ 
      return num * num;
}

然后用户会调用:

[MathFunctions square:34];

而不需要实例化类!

你也可以使用类函数来返回自动释放的对象,比如NSArray

+ (NSArray *)arrayWithObject:(id)object

它接受一个对象,将其放入数组中,并返回数组的自动释放版本,不需要内存管理,这对于临时数组和类似的东西很好。

我希望你现在明白什么时候和/或为什么你应该使用类方法!!

其他回答

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

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

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

对上述答案的更新,我同意实例方法使用类的实例,而类方法可以只使用类名。

在Objective-C中实现自动引用计数后,实例方法和类方法之间不再有任何区别。

例如[NS StringWithformat:..][[NSString alloc] initwithformat:..]]实例方法,两者在ARC之后是一样的

类方法


类方法通常要么创建类的新实例,要么检索类的一些全局属性。类方法不能对实例进行操作,也不能访问实例变量。


实例方法


实例方法对类的特定实例进行操作。例如,您实现的accessors方法都是实例方法。您可以使用它们来设置或获取特定对象的实例变量。


调用


要调用实例方法,需要将消息发送到类的实例。

要调用类方法,可以直接将消息发送给类。


来源:IOS - Objective-C -类方法和实例方法

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

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

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

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

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

类方法

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

实例方法

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