类方法和实例方法的区别是什么?
实例方法是访问器(getter和setter),而类方法几乎是其他所有东西吗?
类方法和实例方法的区别是什么?
实例方法是访问器(getter和setter),而类方法几乎是其他所有东西吗?
当前回答
所有的技术细节都已经在其他答案中很好地涵盖了。我只是想分享一个简单的类比,我认为它很好地说明了类和实例之间的区别:
类就像房子的蓝图:你只有一个蓝图,(通常)你不能单独用蓝图做那么多。
实例(或对象)是您根据蓝图构建的实际房屋:您可以从相同的蓝图构建许多房屋。然后,您可以为每个房子的墙壁涂上不同的颜色,就像您可以独立地更改类的每个实例的属性而不影响其他实例一样。
其他回答
你的问题的答案并不特定于objective-c,但是在不同的语言中,类方法可能被称为静态方法。
类方法和实例方法之间的区别是
类方法
操作Class变量(它们不能访问实例变量) 不需要一个对象被实例化应用 有时可能是一种代码气味(一些刚接触OOP的人把它作为在面向对象环境中进行结构化编程的拐杖)
实例方法
操作实例变量和类变量 必须对一个实例化对象进行操作
补充上述答案
Class方法将在Class上工作,我们将它用于一般用途,如+stringWithFormat,类的大小,最重要的是用于init等
NSString *str = [NSString stringWithFormat:@"%.02f%%",someFloat];
实例方法对一个类的实例起作用,而不是对一个类起作用,比如我们有两个人,我们想知道每个人的余额,这里我们需要使用实例方法。因为它不会返回一般响应。例如,确定NSSArray的计数等。
[johnson getAccountBalance];
[ankit getAccountBalance];
Instances方法作用于类的实例(即“对象”)。类方法与类相关联(大多数语言使用关键字static来表示这些家伙)。
在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];
我认为最好的理解方法是看一下alloc和init。正是这个解释让我明白了其中的区别。
类方法
类方法作为一个整体应用于类。如果检查alloc方法,它是一个类方法,由方法声明前的+表示。它是一个类方法,因为它应用于类以创建该类的特定实例。
实例方法
使用实例方法修改类的特定实例,该实例是该实例惟一的,而不是整个类惟一的。例如,Init(在方法声明之前用-表示)是一个实例方法,因为您通常在用alloc创建该类之后修改该类的属性。
例子
NSString *myString = [NSString alloc];
调用类方法alloc是为了生成该类的实例。注意消息的接收者是一个类。
[myString initWithFormat:@"Hope this answer helps someone"];
你在修改NSString的实例myString通过在那个实例上设置一些属性。注意消息的接收者是一个实例(NSString类的对象)。