关于Java:如何在Objtovi-C中创建静态方法?

How can I make a static method in Objective-C?

在爪哇中,我可能有一个类,例如,Utility,并且我有一个叫做EDCOX1(1)的静态方法,所以我可以这样做:

1
Utility.changeToCapitalLetter(myString);

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

谢谢


在Objective-C中,您称之为"类方法",请参见以下内容:

1
2
3
4
5
6
@interface MyClass : NSObject

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

@end

+是最重要的;您可以这样调用方法:[MyClass aClassMethod];


From Wikipedia: Static methods neither require an instance of the
class nor can they implicitly access the data (or this, self, Me,
etc.) of such an instance.

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

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

与静态方法不同,Objective-C的类方法可以被继承(与前面提到的自身结合起来,这正是许多类可以在不需要自己自定义实现的情况下在nsObject上共享一个简单的+alloc实现的原因),并且调用一个类方法要经过完全相同的基于objc_msgsend*的DI与任何其他方法调用站点一样的飞溅机制。

Objective-C的类方法可以在整个类层次结构中被重写,并且可以被改写。通常提供静态方法代替类方法的语言不支持这些方法。

虽然类方法和静态方法在实践中大多数时候是相同的,但它们是不同的。对于静态方法,类充当命名空间限定符。对于类方法,类本身是一个对象,因此类方法对类对象的作用与实例方法对实例的作用完全相同,因此可以执行以下操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    @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语言的一部分。

归根结底,静态方法和类方法是非常不同的。虽然这种差异对于日常编码来说是透明的,但是在某些情况下,了解类方法的工作方式可以为您节省大量不必要的代码行。

这里和这里的原始链接