0

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

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

4 回答 4

1

类方法:

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

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

于 2012-06-03T23:13:16.480 回答
1

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

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

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

于 2012-06-03T23:13:22.580 回答
1

类方法有多种用途:

  • 正如您所听说的,它们对于创建新对象至关重要。创建对象是一个两步过程:首先,使用类方法为对象分配内存+alloc 然后使用通常以. 该方法必须是类方法,因为您没有可以调用它的实例;你只知道类名。该方法应该是一个实例方法,因为返回一个实例,您要初始化该实例唯一的属性,而不是整个类。因此,您在上面的代码中使用了一个类方法,然后是一个实例方法: -init+alloc-init+allocUIView *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 类。

我敢肯定还有更多,但这应该会给你一些想法。

于 2012-06-03T23:16:26.757 回答
0

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

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

例如

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

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

于 2012-06-03T22:36:07.497 回答