我该如何在Objective-C中创建一个静态方法?

56

在Java中,我可能有一个类,比如Utility,并且我有一个名为changeToCapitalLetter的静态方法,因此我可以像这样做:

Utility.changeToCapitalLetter(myString);

我怎样才能在Objective C中完成类似的事情?

非常感谢。

2个回答

130

在Objective-C中,你称之为"类方法",可以参考这里

@interface MyClass : NSObject

+ (void)aClassMethod;
- (void)anInstanceMethod;

@end

+ 是重要的部分;你需要这样调用方法:[MyClass aClassMethod];


2
没错,但请记住您也可以声明普通的全局 C 函数。 - Johannes Rudolph
如果我们在Obj-C中使用static,当然希望它能够被Swift访问,那么全局的C是否可用于Swift呢? - Top-Master

16

来自维基百科:静态方法既不需要类的实例,也不能隐式访问此类实例的数据(或this、self、Me等)。

这恰好描述了 Objective-C 的类方法所不是。

Objective-C 类方法非常需要一个作为方法调用目标的实例。也就是说,它需要描述被调用类对象的元类的实例。

与静态方法不同,Objective-C 的类方法可以被继承(这正是许多类可以共享单个简单的 NSObject 上的 +alloc 实现而不需要自定义实现的原因,结合具有前面提到的 self,)并且调用类方法通过与任何其他方法调用站点完全相同的基于 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语言的一部分。

总之,静态方法和类方法非常不同。虽然这种区别在日常编码中大多数情况下都是透明的,但仍有一些情况需要知道类方法的工作方式,这可以避免大量不必要的代码。

原始链接在这里在这里


9
公平地说,这并不是一个原创的回答;它是从这里写来的。 - Nathan Van Dyken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接