Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Objective-C中创建静态方法?_Java_Objective C_Programming Languages - Fatal编程技术网

Java 如何在Objective-C中创建静态方法?

Java 如何在Objective-C中创建静态方法?,java,objective-c,programming-languages,Java,Objective C,Programming Languages,在Java中,我可能有一个类,例如,Utility,我有一个静态方法,名为changeToCapitalLetter,因此我可以这样做: Utility.changeToCapitalLetter(myString); 我如何在目标C中做类似的事情 非常感谢在Objective-C中,您称之为“类方法”,请参见: +是最重要的事情;您可以这样调用该方法:[MyClass aClassMethod] 来自Wikipedia:静态方法不需要 类也不能隐式访问数据(或this、self、Me、, (

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

Utility.changeToCapitalLetter(myString);
我如何在目标C中做类似的事情


非常感谢

在Objective-C中,您称之为“类方法”,请参见:

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

来自Wikipedia:静态方法不需要 类也不能隐式访问数据(或this、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是类对象还是and实例。如果您熟悉factory类模式,则此模式是Objective-C语言的一部分

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


原始链接和

没错,但请记住,您也可以声明普通的全局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];
}