Java 如何在Objective-C中创建静态方法?
在Java中,我可能有一个类,例如,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、, (
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];
}