【问题标题】:How can I make a static method in Objective-C?如何在 Objective-C 中创建静态方法?
【发布时间】:2010-04-22 13:52:19
【问题描述】:

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

Utility.changeToCapitalLetter(myString);

如何在 Objective C 中做类似的事情?

非常感谢

【问题讨论】:

    标签: java objective-c programming-languages


    【解决方案1】:

    在 Objective-C 中,你称之为“类方法”,参见here

    @interface MyClass : NSObject
    
    + (void)aClassMethod;
    - (void)anInstanceMethod;
    
    @end
    

    +很重要;你这样调用方法:[MyClass aClassMethod];

    【讨论】:

    • 对,但请记住,您也可以随时声明普通的全局 C 函数。
    • 如果我们向static 询问Obj-C,当然我们希望Swift 可以访问它,那么Swift 是否可以使用全局C?
    【解决方案2】:

    来自 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 语言的一部分。

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

    原始链接herehere

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 2011-04-18
    • 2014-04-24
    • 1970-01-01
    • 2013-01-29
    相关资源
    最近更新 更多