类方法和实例方法的区别是什么?
实例方法是访问器(getter和setter),而类方法几乎是其他所有东西吗?
类方法和实例方法的区别是什么?
实例方法是访问器(getter和setter),而类方法几乎是其他所有东西吗?
当前回答
注意:这只是伪代码格式
类方法
它所需要做的几乎都是在编译时完成的。它不需要任何用户输入,也不需要基于实例进行计算。关于它的一切都是基于类/蓝图-这是独特的,即你没有多个蓝图为一个类。在编译期间可以有不同的变化吗?不,因此类是唯一的,所以无论你调用多少次类方法,指向它的指针都是一样的。
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,类型方法和类方法是一样的。
其他回答
以一款衍生出大量汽车的游戏为例。每个人都属于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]
没有明确的答案,但是如果你觉得加入一个类方法可以改进你的代码,那就试试吧,记住类方法只能让你使用其他类方法/变量。
类方法
是声明为静态的方法。可以在不创建类实例的情况下调用该方法。类方法只能操作类成员,而不能操作实例成员,因为类方法不知道实例成员。类的实例方法也不能从类方法内部调用,除非在该类的实例上调用它们。
实例方法
另一方面,需要类的实例存在才能调用它们,因此需要使用new关键字创建类的实例。实例方法操作于类的特定实例。实例方法没有被声明为静态的。
类方法不能改变或知道任何实例变量的值。这应该是判断实例方法是否可以是类方法的标准。
还要记住,同样的思想也适用于变量。在谈论变量时,你会遇到静态、成员、实例、类等术语,就像谈论方法/函数一样。
似乎Obj-C社区的常用术语是实例变量的ivar,但我还不是一个Obj-C的人。
在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];