【发布时间】:2010-04-22 13:52:19
【问题描述】:
在Java中,我可能有一个类,例如Utility,我有一个名为changeToCapitalLetter的静态方法,所以我可以这样做:
Utility.changeToCapitalLetter(myString);
如何在 Objective C 中做类似的事情?
非常感谢
【问题讨论】:
标签: java objective-c programming-languages
在Java中,我可能有一个类,例如Utility,我有一个名为changeToCapitalLetter的静态方法,所以我可以这样做:
Utility.changeToCapitalLetter(myString);
如何在 Objective C 中做类似的事情?
非常感谢
【问题讨论】:
标签: java objective-c programming-languages
在 Objective-C 中,你称之为“类方法”,参见here:
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
+很重要;你这样调用方法:[MyClass aClassMethod];
【讨论】:
static 询问Obj-C,当然我们希望Swift 可以访问它,那么Swift 是否可以使用全局C?
来自 Wikipedia:静态方法不需要 类也不能隐式访问数据(或 this、self、Me、 等)这样的实例。
这准确地描述了 Objective-C 的类方法不是什么。
Objective-C 类方法非常需要作为方法调用目标的实例。也就是说,它需要一个描述被调用的类对象的元类实例。
与静态方法不同,Objective-C 的类方法可以被继承(再加上前面提到的 self,这正是为什么许多类可以在 NSObject 上共享一个简单的 +alloc 实现而不需要它们自己的自定义实现) 并调用类方法通过与任何其他方法调用站点完全相同的基于 objc_msgSend* 的调度机制。
Objective-C 的类方法可以在类层次结构中被覆盖,并且它们可以被调配。在通常提供静态方法来代替类方法的语言中,这些都不支持。
虽然类方法和静态方法在大多数情况下实际上是相同的,但它们是不同的。使用静态方法,该类充当命名空间限定符。对于类方法,类本身就是一个对象,因此类方法对类对象的作用与实例方法对实例的作用完全相同,因此您可以执行以下操作
@interface TestClass : NSObject
+(void)classOrInstanceMethod;
-(void)classOrInstanceMethod;
@end
@implementation TestClass
+(void)classOrInstanceMethod{
NSLog(@"%s", __PRETTY_FUNCTION__);
}
-(void)classOrInstanceMethod{
NSLog(@"%s", __PRETTY_FUNCTION__);
}
@end
int main(int argc, const char* argv[])
{
@autoreleasepool{
NSLog(@"Static method in ObjectiveC");
}
NSArray* arr = [NSArray arrayWithObjects:[[TestClass alloc]init],
[TestClass class], nil];
for(id obj in arr)
[obj classOrInstanceMethod];
}
调用哪个版本的 classOrInstanceMethod 取决于 obj 是类对象还是实例。如果您熟悉工厂类模式,那么此模式是 Objective-C 语言的一部分。
底线是静态方法和类方法是非常不同的。虽然这种差异对于日常编码目的来说大部分是透明的,但在某些情况下,了解类方法的工作原理可以为您节省大量不必要的代码行。
【讨论】: