如何在Objective-C中制作静态方法?
例如,在Java中,我可能有一个类,我有一个名为的静态方法,所以我可以做这样的事情:Utility
changeToCapitalLetter
Utility.changeToCapitalLetter(myString);
如何在 Objective C 中执行类似的操作?
多谢
例如,在Java中,我可能有一个类,我有一个名为的静态方法,所以我可以做这样的事情:Utility
changeToCapitalLetter
Utility.changeToCapitalLetter(myString);
如何在 Objective C 中执行类似的操作?
多谢
在Objective-C中,你称之为“类方法”,请参阅此处:
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
+是重要的事情;你这样调用这个方法:[MyClass aClassMethod];
来自维基百科:静态方法既不需要类的实例,也不能隐式访问此类实例的数据(或这个,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 语言的一部分。
最重要的是,静态方法和类方法非常不同。虽然这种差异对于日常编码目的来说基本上是透明的,但在某些情况下,了解类方法的工作原理可以节省大量不必要的代码行。