如何在Objective-C中制作静态方法?

2022-08-31 21:09:27

例如,在Java中,我可能有一个类,我有一个名为的静态方法,所以我可以做这样的事情:UtilitychangeToCapitalLetter

Utility.changeToCapitalLetter(myString);

如何在 Objective C 中执行类似的操作?

多谢


答案 1

在Objective-C中,你称之为“类方法”,请参阅此处

@interface MyClass : NSObject

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

@end

+是重要的事情;你这样调用这个方法:[MyClass aClassMethod];


答案 2

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

这恰恰描述了Objective-C的类方法不是什么。

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

与静态方法不同,Objective-C的类方法可以继承(这与上述自我相结合,正是为什么许多类可以在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 语言的一部分。

最重要的是,静态方法和类方法非常不同。虽然这种差异对于日常编码目的来说基本上是透明的,但在某些情况下,了解类方法的工作原理可以节省大量不必要的代码行。

原始链接这里这里