在Objective-C中,何时应该使用类方法,何时应该使用实例方法?

Tir*_*rth 10 iphone objective-c

Objective-C中的类和实例方法之间的区别是什么?我应该在何时使用它们?

bbu*_*bum 12

使用疲惫的旧车类比......

想象一个类,就像它是一个制造类的实例的工厂.例如,您可能有一个Car类,您可以声明一个方法,如:

+ carWithColor: (NSColor *) aColor;
Run Code Online (Sandbox Code Playgroud)

然后该方法将创建一个新的Car实例,设置颜色并返回它:

 + carWithColor: (NSColor *) aColor
 {
     Car *aCar = [[[self alloc] init] autorelease];
     [aCar paintWithColor: aColor];
     return aCar;
 }
Run Code Online (Sandbox Code Playgroud)

现在,Car类将声明一个允许绘制汽车的实例方法.为什么是实例方法?因为每辆车都可以有不同的颜色(并且汽车的颜色可能存储在实例变量中).

- (void) paintWithColor: (NSColor *) aColor
{
    ... do your paint stuff here ...
}
Run Code Online (Sandbox Code Playgroud)

Objective-C文档的Objects,Classes和Messaging部分对此进行了解释.


smi*_*Bot 8

这是一篇旧帖子,但由于它首先出现在谷歌搜索中,我以为我会添加它.

我不打算谈论用作工厂方法的类方法.我想谈谈它们在实用方法中的用法.您可以/应该使用类方法来实现独立于状态的实用程序方法.这是什么意思?好吧,例如,如果您以相同的方式为所有实例格式化日期,那么这是一个应该是类方法的实用方法.想想像螺丝刀一样的实用方法.每次想要使用它时,您都不需要创建螺丝刀的新实例.螺丝刀保持不变.因此,例如,我有一个类,其中包含一个私有方法,该方法生成一个用于显示到视图的emDashes字符串.该方法不依赖于状态,因此不会因实例而异.想想像常量这样的类实用程序方法.

+ (NSString *)emDashString {
return @"   \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014";
Run Code Online (Sandbox Code Playgroud)

}

您可以在类中一般调用此方法(在我的示例中它是私有的),如下所示:

NSString *string = [[self class] emDashString ];
Run Code Online (Sandbox Code Playgroud)

我故意选择了一个简单的例子来推动这一点.如果你在课堂上不止一次需要这个字符串,你只会打扰这个类实用程序方法.请注意,我没有按名称引用类,而是使用[self class]来调用它,因为这是在内部调用的.如果它已暴露,你想从另一个类调用它,那么像往常一样通过类名引用它.