类方法和实例方法有什么区别?

463

类方法和实例方法有什么区别?

实例方法是访问器(获取器和设置器),而类方法基本上包括其他所有内容吗?

18个回答

3

以一个生成大量汽车的游戏为例,每个汽车都属于CCar类。 当汽车被实例化时,它会调用

[CCar registerCar:self]

所以,CCar类可以列出每个已实例化的CCar。 假设用户完成了一个级别,并想要删除所有汽车...你可以: 1- 手动遍历每个CCar创建并执行whicheverCar.remove(); 或者 2- 在CCar中添加一个removeAllCars方法,在调用[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] 并没有一个明确的答案,但如果你觉得加入一个类方法可以改善你的代码,那么就试一试吧,并且记住,一个类方法只能让你使用其他的类方法/变量。

3

类方法


类方法通常是创建类的新实例或检索类的某些全局属性。类方法不操作实例也没有访问实例变量的权限。


实例方法


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


调用


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

要调用类方法,直接将消息发送到类。


来源: IOS - Objective-C - Class Methods And Instance Methods


3

类方法

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

实例方法

相反,需要存在类的实例才能调用实例方法,因此需要使用new关键字创建类的实例。实例方法操作类的特定实例。实例方法未声明为静态方法。


它也可以使用“alloc”关键字创建,而不仅仅是“new”。此外,Objective-C不要求存在实例才能调用实例方法,您可以向空指针发送消息。 - Elviss Strazdins

2

类方法不能更改或知道任何实例变量的值。这应该是确定实例方法是否可以成为类方法的标准。


我给你-1分,因为你可以将实例传递给类方法,这样它就能够更改并知道它的变量值。 - Elviss Strazdins

1

注意:这只是伪代码格式

类方法

几乎所有需要完成的工作都在编译时完成。它不需要任何用户输入,也不是基于实例计算的。关于它的一切都是基于类/蓝图-这是唯一的,即您不会为一个类拥有多个蓝图。在编译时可以有不同的变化吗?不行,因此该类是唯一的,因此无论您调用类方法多少次,指向它的指针都将是相同的。

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,则类型方法与类方法相同。

1
上面答案的更新,我同意实例方法使用类的实例,而类方法可以只用类名。自从Objective-C引入自动引用计数后,实例方法和类方法之间再也没有区别了。
例如[NSString stringWithFormat:..]是一个类方法,[[NSString alloc] initwithformat:..]是一个实例方法,在ARC之后两者是相同的。

1

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

在 Obj-C 社区中,似乎常见的术语是 ivar 代表实例变量,但我还不是 Obj-C 的专家。


0

补充以上答案

类方法适用于类,我们将其用于一般目的,例如+stringWithFormat,类的大小以及最重要的init等

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

实例方法将在类的实例上工作,而不是在类上工作,就像我们有两个人并且我们想要分别了解每个人的余额一样,在这里我们需要使用实例方法。因为它不会返回通用响应。例如,确定NSSArray的计数等。

[johnson getAccountBalance];
[ankit getAccountBalance];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接