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

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


当前回答

类方法

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

实例方法

另一方面,需要类的实例存在才能调用它们,因此需要使用new关键字创建类的实例。实例方法操作于类的特定实例。实例方法没有被声明为静态的。

其他回答

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

注意:这只是伪代码格式

类方法

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

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,类型方法和类方法是一样的。

与大多数其他答案一样,实例方法使用类的实例,而类方法可以只使用类名。在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方法。

如果我理解正确的话。

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

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

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

对上述答案的更新,我同意实例方法使用类的实例,而类方法可以只使用类名。

在Objective-C中实现自动引用计数后,实例方法和类方法之间不再有任何区别。

例如[NS StringWithformat:..][[NSString alloc] initwithformat:..]]实例方法,两者在ARC之后是一样的