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部分对此进行了解释.
这是一篇旧帖子,但由于它首先出现在谷歌搜索中,我以为我会添加它.
我不打算谈论用作工厂方法的类方法.我想谈谈它们在实用方法中的用法.您可以/应该使用类方法来实现独立于状态的实用程序方法.这是什么意思?好吧,例如,如果您以相同的方式为所有实例格式化日期,那么这是一个应该是类方法的实用方法.想想像螺丝刀一样的实用方法.每次想要使用它时,您都不需要创建螺丝刀的新实例.螺丝刀保持不变.因此,例如,我有一个类,其中包含一个私有方法,该方法生成一个用于显示到视图的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]来调用它,因为这是在内部调用的.如果它已暴露,你想从另一个类调用它,那么像往常一样通过类名引用它.