在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];
来自维基百科:静态方法既不需要类的实例,也不能隐式访问此类实例的数据(或this、self、Me等)。
这恰好描述了 Objective-C 的类方法所不是。
Objective-C 类方法非常需要一个作为方法调用目标的实例。也就是说,它需要描述被调用类对象的元类的实例。
与静态方法不同,Objective-C 的类方法可以被继承(这正是许多类可以共享单个简单的 NSObject 上的 +alloc 实现而不需要自定义实现的原因,结合具有前面提到的 self,)并且调用类方法通过与任何其他方法调用站点完全相同的基于 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语言的一部分。
总之,静态方法和类方法非常不同。虽然这种区别在日常编码中大多数情况下都是透明的,但仍有一些情况需要知道类方法的工作方式,这可以避免大量不必要的代码。
static
,当然希望它能够被Swift访问,那么全局的C是否可用于Swift呢? - Top-Master