How can I make a static method in Objective-C?
在爪哇中,我可能有一个类,例如,
1 | Utility.changeToCapitalLetter(myString); |
如何在目标C中执行类似的操作?
谢谢
在Objective-C中,您称之为"类方法",请参见以下内容:
1 2 3 4 5 6 | @interface MyClass : NSObject + (void)aClassMethod; - (void)anInstanceMethod; @end |
+是最重要的;您可以这样调用方法:
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语言的一部分。
归根结底,静态方法和类方法是非常不同的。虽然这种差异对于日常编码来说是透明的,但是在某些情况下,了解类方法的工作方式可以为您节省大量不必要的代码行。
这里和这里的原始链接