类方法和实例方法有什么区别?
实例方法是访问器(获取器和设置器),而类方法基本上包括其他所有内容吗?
类方法和实例方法有什么区别?
实例方法是访问器(获取器和设置器),而类方法基本上包括其他所有内容吗?
以一个生成大量汽车的游戏为例,每个汽车都属于CCar类。 当汽车被实例化时,它会调用
[CCar registerCar:self]
whicheverCar.remove();
或者
2- 在CCar中添加一个removeAllCars方法,在调用[CCar removeAllCars]时为您执行此操作。例如: allCars[n].remove();
例如,您允许用户为整个应用程序指定默认字体大小,在启动时加载和保存。
没有类方法,您可能需要执行类似于fontSize = thisMenu.getParent().fontHandler.getDefaultFontSize();
[FontHandler getDefaultFontSize]
来解决。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]
并没有一个明确的答案,但如果你觉得加入一个类方法可以改善你的代码,那么就试一试吧,并且记住,一个类方法只能让你使用其他的类方法/变量。类方法通常是创建类的新实例或检索类的某些全局属性。类方法不操作实例也没有访问实例变量的权限。
实例方法作用于类的特定实例。例如,您实现的存取器方法都是实例方法,可以使用它们来设置或获取特定对象的实例变量。
要调用实例方法,将消息发送到类的实例。
要调用类方法,直接将消息发送到类。
类方法
是声明为静态方法的方法。可以在不创建类实例的情况下调用该方法。类方法只能操作类成员,而不能操作实例成员,因为类方法不知道实例成员。除非在调用该类的实例上调用它们,否则无法从类方法中调用该类的实例方法。
实例方法
相反,需要存在类的实例才能调用实例方法,因此需要使用new关键字创建类的实例。实例方法操作类的特定实例。实例方法未声明为静态方法。
类方法不能更改或知道任何实例变量的值。这应该是确定实例方法是否可以成为类方法的标准。
注意:这只是伪代码格式
类方法
几乎所有需要完成的工作都在编译时完成。它不需要任何用户输入,也不是基于实例计算的。关于它的一切都是基于类/蓝图-这是唯一的,即您不会为一个类拥有多个蓝图。在编译时可以有不同的变化吗?不行,因此该类是唯一的,因此无论您调用类方法多少次,指向它的指针都将是相同的。
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.
[NSString stringWithFormat:..]
是一个类方法,[[NSString alloc] initwithformat:..]
是一个实例方法,在ARC之后两者是相同的。还要记住,同样的思想也适用于变量。当谈论变量时,您会遇到像静态、成员、实例、类等术语,就像您谈论方法/函数一样。
在 Obj-C 社区中,似乎常见的术语是 ivar 代表实例变量,但我还不是 Obj-C 的专家。
补充以上答案
类方法适用于类,我们将其用于一般目的,例如+stringWithFormat,类的大小以及最重要的init等
NSString *str = [NSString stringWithFormat:@"%.02f%%",someFloat];
实例方法将在类的实例上工作,而不是在类上工作,就像我们有两个人并且我们想要分别了解每个人的余额一样,在这里我们需要使用实例方法。因为它不会返回通用响应。例如,确定NSSArray的计数等。
[johnson getAccountBalance];
[ankit getAccountBalance];