类方法和实例方法的区别是什么?
实例方法是访问器(getter和setter),而类方法几乎是其他所有东西吗?
类方法和实例方法的区别是什么?
实例方法是访问器(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];
其他回答
如果我理解正确的话。
类方法不需要分配该对象的实例来使用/处理它。类方法是自包含的,可以不依赖于该类的任何对象的状态进行操作。类方法被期望为它自己的所有工作分配内存,并在完成时释放,因为该类的任何实例都不能释放以前调用类方法时分配的任何内存。
实例方法正好相反。除非分配该类的实例,否则无法调用它。它就像一个普通的类,有一个构造函数,也可以有一个析构函数(清理所有分配的内存)。
在大多数情况下(除非您正在编写一个可重用的库),您不应该需要类变量。
注意:这只是伪代码格式
类方法
它所需要做的几乎都是在编译时完成的。它不需要任何用户输入,也不需要基于实例进行计算。关于它的一切都是基于类/蓝图-这是独特的,即你没有多个蓝图为一个类。在编译期间可以有不同的变化吗?不,因此类是唯一的,所以无论你调用多少次类方法,指向它的指针都是一样的。
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,类型方法和类方法是一样的。
我认为最好的理解方法是看一下alloc和init。正是这个解释让我明白了其中的区别。
类方法
类方法作为一个整体应用于类。如果检查alloc方法,它是一个类方法,由方法声明前的+表示。它是一个类方法,因为它应用于类以创建该类的特定实例。
实例方法
使用实例方法修改类的特定实例,该实例是该实例惟一的,而不是整个类惟一的。例如,Init(在方法声明之前用-表示)是一个实例方法,因为您通常在用alloc创建该类之后修改该类的属性。
例子
NSString *myString = [NSString alloc];
调用类方法alloc是为了生成该类的实例。注意消息的接收者是一个类。
[myString initWithFormat:@"Hope this answer helps someone"];
你在修改NSString的实例myString通过在那个实例上设置一些属性。注意消息的接收者是一个实例(NSString类的对象)。
你的问题的答案并不特定于objective-c,但是在不同的语言中,类方法可能被称为静态方法。
类方法和实例方法之间的区别是
类方法
操作Class变量(它们不能访问实例变量) 不需要一个对象被实例化应用 有时可能是一种代码气味(一些刚接触OOP的人把它作为在面向对象环境中进行结构化编程的拐杖)
实例方法
操作实例变量和类变量 必须对一个实例化对象进行操作
类方法
类方法通常要么创建类的新实例,要么检索类的一些全局属性。类方法不能对实例进行操作,也不能访问实例变量。
实例方法
实例方法对类的特定实例进行操作。例如,您实现的accessors方法都是实例方法。您可以使用它们来设置或获取特定对象的实例变量。
调用
要调用实例方法,需要将消息发送到类的实例。
要调用类方法,可以直接将消息发送给类。
来源:IOS - Objective-C -类方法和实例方法