请解释课堂方法

时间:2012-06-03 22:29:21

标签: objective-c ios5 xcode4

我发现很难理解什么时候需要创建类方法。从我读过的,它们对于创建新对象很重要,但我不知道如何。下面的类创建一个简单的形状黑色矩形。任何人都可以告诉我如何使用类方法来做一些我无法用实例方法做的事情吗?

Shape.h

#import <UIKit/UIKit.h>
@interface Shape : UIView; 
- (id) initWithX: (int)xVal andY: (int)yVal;
@end

Shape.m

#import "Shape.h"
@implementation Shape 
- (id) initWithX:(int )xVal andY:(int)yVal {
self = [super init];    
UIView *shape = [[UIView alloc] initWithFrame:CGRectMake(xVal, yVal, 10, 10)];
shape.backgroundColor = [UIColor blackColor];
[self addSubview:shape];
return self;
}
@end

4 个答案:

答案 0 :(得分:1)

班级方法:

  • 当您还没有实例时可以调用
  • 不在实例上运行(除非将其作为参数传入或由方法创建),因此无权访问任何特定实例的实例变量。
  • 可以在子类中重写,不像简单函数(否则与之前的点匹配)

正如其他人所指出的那样,我确信你一直都在使用类方法。如果没有别的,那么+alloc

答案 1 :(得分:1)

类方法只是不需要对象的方法。因此,任何不使用其对象的实例方法都可以是类方法。您必须使用类方法的唯一时间是必须在没有对象的情况下调用方法。 alloc是一个很好的例子:它创建对象并返回它,因此根据定义,在调用它时没有对象。

我对类方法的另一个用处(在嵌入式系统中的C ++中,所以我没有要显示的代码)是让一个类保留所有对象的双向链表。 (这对于调试转储非常有用;在嵌入式开发中,您的调试工具通常只是某种printf。)

该类有两个成员,它们指向列表的第一个和最后一个元素,构造函数和析构函数插入并从列表中删除一个对象。访问第一个和最后一个对象的函数是类方法,因为当您想要遍历对象列表但尚未拥有对象时,可以调用它们。

答案 2 :(得分:1)

类方法有多种用途:

  • 正如您所听到的,它们对于创建新对象至关重要。创建对象分为两步:首先,使用+alloc 方法为对象分配内存,然后使用一些实例方法初始化对象通常以-init开头。 +alloc方法必须是类方法,因为您没有可以调用它的实例;你只知道班级名称。 -init方法应该是一个实例方法,因为+alloc返回一个实例,您要初始化该实例的唯一属性,而不是整个类。那么,你在上面的代码中使用了一个类方法然后使用了一个实例方法: UIView *shape = [[UIView alloc] initWithFrame:CGRectMake(xVal, yVal, 10, 10)];

  • 类方法对于检索单例或类的共享实例很有用。例如,NSUserDefaults类存储与您的应用相关联的首选项和设置。在大多数情况下,人们喜欢为他们的整个应用程序使用一组首选项,因此它有一个类方法+standardUserDefaults,它返回一个NSUserDefaults的单个实例,每个人都可以在应用程序的任何位置使用生命周期获取与应用程序关联的所有首选项。如果没有单例和类方法,您必须在整个应用程序中创建并传递NSUserDefaults的实例,这会变得混乱。其他示例包括+[UIDevice currentDevice]+[NSFileManager defaultManager]

  • 类方法非常适合返回类的所有实例共享的数据或属性。例如,UIView有一个类方法+layerClass,它返回视图所托管的图层类型。由于特定UIView子类的所有实例都使用相同类型的层,因此它与单个实例无关,因此作为类方法有意义。

  • 你会看到许多被称为“便利方法”的类方法。这些方法(通常)将对+alloc-init的调用组合在一起,并返回一个类的自动释放实例。例如,您可以通过编写[NSArray arrayWithObjects:...]而不是[[[NSArray alloc] initWithObjects:...] autorelease]来保存一些输入内容。如果您使用ARC,这些便利方法不太有用,但它们仍然在Cocoa中无处不在。

  • 类方法有时也用于实用程序类或没有状态的类,并且只有一堆方法可以接收所需的所有参数。例如,您可能有+[PhoneUtilities parseAreaCodeFromPhoneNumber:string]之类的方法。 Cocoa内置的这些方法并不多;有些人认为最好使用实例方法使它们成为常规C函数,单例或常规Objective-c类。

我确信还有更多,但这应该会给你一些想法。

答案 3 :(得分:0)

我的答案是,当您需要执行一些实用程序函数/方法并且需要对某个特定实例或对象执行操作时,类方法非常有用。

例如,在我自己的代码中,我通常在类中执行类方法,无论哪个对象都可以调用方法,结果都是相同的。像:

E.G。

@interface MyAppCacheFiles
    + (NSURL *) getFileURLOfLocalCache;
@end

这些也可以被视为便利方法(例如NSString +stringWithFormat:NSArray +arrayWithArray:)。