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

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


当前回答

在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];

其他回答

补充上述答案

Class方法将在Class上工作,我们将它用于一般用途,如+stringWithFormat,类的大小,最重要的是用于init等

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

实例方法对一个类的实例起作用,而不是对一个类起作用,比如我们有两个人,我们想知道每个人的余额,这里我们需要使用实例方法。因为它不会返回一般响应。例如,确定NSSArray的计数等。

[johnson getAccountBalance];
[ankit getAccountBalance];

如果我理解正确的话。

类方法不需要分配该对象的实例来使用/处理它。类方法是自包含的,可以不依赖于该类的任何对象的状态进行操作。类方法被期望为它自己的所有工作分配内存,并在完成时释放,因为该类的任何实例都不能释放以前调用类方法时分配的任何内存。

实例方法正好相反。除非分配该类的实例,否则无法调用它。它就像一个普通的类,有一个构造函数,也可以有一个析构函数(清理所有分配的内存)。

在大多数情况下(除非您正在编写一个可重用的库),您不应该需要类变量。

与大多数其他答案一样,实例方法使用类的实例,而类方法可以只使用类名。在Objective-C中,它们的定义如下:

@interface MyClass : NSObject

+ (void)aClassMethod;
- (void)anInstanceMethod;

@end

它们可以这样使用:

[MyClass aClassMethod];

MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];

一些真实世界的类方法的例子是许多基础类的方便方法,如NSString的+stringWithFormat:或NSArray的+arrayWithArray:。实例方法是NSArray的-count方法。

以一款衍生出大量汽车的游戏为例。每个人都属于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]

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

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

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

类方法

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

实例方法

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