我想知道何时以及何时不使用类方法和实例方法。我需要一些实际的例子。我真的很困惑。另一个问题:我们不能用实例方法做与类方法完全相同的事情吗?
5 回答
如果要使用实例对象或实例变量,则必须使用实例方法。Bcz 在类中,您无法访问 Instance 实例对象或实例变量。
类方法是静态方法。
对实用函数使用类方法,对面向对象的东西使用实例方法。例如。对于数学计算(例如 sin x ),使用类方法。但是对于调用特定于对象的行为..使用实例方法..
类方法:该方法不绑定到任何特定对象。在某种程度上,它就像类命名空间中的一个自由函数。没有“自我”指针。例如 [UIScreen mainScreen] 是一个类方法,因为只有一个屏幕,不需要关心多个“屏幕实例”。
实例方法:绑定到特定对象。
这适用于大多数 OO 语言,而不仅仅是 obj-C。
在实现级别,实例方法调用包含指向数据结构(对象)的隐藏指针,而类方法则没有。
要问的实际问题是您的调用是否需要向调用发送一些特定数据,这些数据是或可以最好地封装为对象内的实例数据。
您(通常)可以将类方法作为实例方法执行相同的操作,但是您必须在调用中显式地将对象作为可见参数传递,这看起来更丑陋,并且还可能禁用 Objective C 语言的某些方法覆盖功能.
顾名思义,类方法绑定到类。您可以仅使用特定类的名称来调用它们。这些通常可以是类的公开方法。例如 NSArray
+ (id)arrayWithArray:(NSArray *)array;
.
你用类名 NSArray 来调用它。您所期望的只是创建该特定类类型的对象。这不需要调用对象。这些也是非常基本的方法,因此最好将其作为类方法。
另一方面,顾名思义,实例方法与实例非常绑定。对象是封装类的状态(ivars)和行为(方法)的实体。这可能非常特定于对象。例如
- (NSUInteger)count;
让我们采用NSArray *a 和NSArray *b。如果a包含 5 个项目而b包含 4 个项目,则调用这些实例的实例方法将产生不同的结果。这就是为什么我们需要在调用实例方法时初始化实例。它们在被调用的对象的上下文(或状态)上工作。它们也没有像类方法那样公开。
希望这可以帮助。