在Java中,我可能有一个类,例如Utility
,我有一个名为changeToCapitalLetter
的静态方法,所以我可以这样做:
Utility.changeToCapitalLetter(myString);
如何在Objective C中执行类似的操作?
非常感谢
答案 0 :(得分:100)
在Objective-C中,您称之为“类方法”,请参阅here:
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
+ 是重要的事情;你调用这样的方法:[MyClass aClassMethod];
答案 1 :(得分:15)
来自维基百科:静态方法既不需要实例也不需要 类也不能隐含地访问数据(或者这个,我自己,我, 等)这样的例子。
这准确描述了Objective-C的类方法没有。
Objective-C类方法非常需要一个实例作为方法调用的目标。也就是说,它需要一个描述被调用的类对象的元类实例。
与静态方法不同,Objective-C的类方法可以被继承(结合具有前面提到的self,正是为什么许多类可以在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语言的一部分。
底线是静态方法和类方法非常不同。虽然这种差异对于日常编码目的而言大部分都是透明的,但仍然有一些情况可以了解类方法的工作方式,可以为您节省大量不必要的代码。