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

实例方法是访问器(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() { ... }
}

Instances方法作用于类的实例(即“对象”)。类方法与类相关联(大多数语言使用关键字static来表示这些家伙)。

注意:这只是伪代码格式

类方法

它所需要做的几乎都是在编译时完成的。它不需要任何用户输入,也不需要基于实例进行计算。关于它的一切都是基于类/蓝图-这是独特的,即你没有多个蓝图为一个类。在编译期间可以有不同的变化吗?不,因此类是唯一的,所以无论你调用多少次类方法,指向它的指针都是一样的。

PlanetOfLiving: return @"Earth" // No matter how many times you run this method...nothing changes.

实例方法

相反,实例方法发生在运行时,因为只有在那时,您才创建了某个对象的实例,而该对象可能在每次实例化时都有所不同。

initWithName: @"John" lastName: @"Doe"Age:12 @"cool"
initWithName: @"Donald" lastName: @"Drumpf"Age:5 attitude:@"He started"
initWithName: @"President" lastName: @"Obama"Age:54 attitude: @"Awesome"
//As you can see the value can change for each instance.

如果你来自其他语言静态方法和类方法是一样的。 如果你来自Swift,类型方法和类方法是一样的。

还要记住,同样的思想也适用于变量。在谈论变量时,你会遇到静态、成员、实例、类等术语,就像谈论方法/函数一样。

似乎Obj-C社区的常用术语是实例变量的ivar,但我还不是一个Obj-C的人。

以一款衍生出大量汽车的游戏为例。每个人都属于CCar班。 当一个car被实例化时,它会调用

[CCar registerCar:self]

所以CCar类,可以列出每个实例化的CCar。 让我们假设用户完成了一个关卡,并想要移除所有汽车……你可以: 1-浏览你手动创建的每一个CCar的列表,并执行那个vercar .remove(); 或 2-添加一个removeAllCars方法到CCar,这将为你做,当你调用[CCar removeAllCars]。即allCars [n] .remove ();

或者,例如,你允许用户为整个应用程序指定默认字体大小,在启动时加载和保存。 如果没有类方法,您可能必须执行如下操作

fontSize = thisMenu.getParent().fontHandler.getDefaultFontSize();

使用类方法,你可以使用[FontHandler getDefaultFontSize]。

至于removeVowels函数,你会发现像c#这样的语言实际上都有特定的方法,如toLower或toUpper。

例如myString.removeVowels()和String.removeVowels(myString)(在ObjC中,这将是[String removeVowels:myString])。

在这种情况下,实例很可能调用类方法,因此两者都可用。 即。

public function toLower():String{
  return String.toLower();
}

public static function toLower( String inString):String{
 //do stuff to string..
 return newString;
}

基本上,myString.toLower()调用[String toLower:ownValue]

没有明确的答案,但是如果你觉得加入一个类方法可以改进你的代码,那就试试吧,记住类方法只能让你使用其他类方法/变量。