请解释类方法

Posted

技术标签:

【中文标题】请解释类方法【英文标题】:Please explain class methods 【发布时间】:2012-06-03 22:29:20 【问题描述】:

我很难理解何时需要创建类方法。根据我的阅读,它们对于创建新对象很重要,但我不明白如何。下面的类创建一个简单的黑色矩形。谁能告诉我如何合并一个类方法来做一些我不能用实例方法做的事情?

形状.h

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

形状.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

【问题讨论】:

你注意到alloc是一个类方法了吗?一定是因为调用时没有对象。 【参考方案1】:

类方法有多种用途:

正如您所听说的,它们对于创建新对象至关重要。创建对象是一个两步过程:首先,使用 +alloc class 方法为对象分配内存,然后使用通常开始的一些 instance 方法初始化对象与-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 类。

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

【讨论】:

非常感谢您的详细回复。【参考方案2】:

类方法:

可以在您没有实例时调用(还) 不在实例上操作(除非作为参数传入或由方法创建),因此无权访问任何特定实例的实例变量。 可以在子类中被覆盖,不像一个简单的函数(否则与前面的点匹配)

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

我的回答是,当您需要执行一些实用功能/方法并且不需要需要对某些特定实例或对象执行操作时,类方法非常有用。

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

例如

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

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

【讨论】:

以上是关于请解释类方法的主要内容,如果未能解决你的问题,请参考以下文章

请解释python面向对象中的继承

请解释如何在我的代码中实现main方法?

JAVA中,类、对象、实体、实体类、实体对象之间存在怎样的联系??请高手做形象的解释。

c++解决二义性的方法

k 表示聚类方法得分为负

抽象类可继承实体类(要有明确的构造方法),这句话该怎么理解?