Tat*_*tat 38 java programming-languages objective-c
在Java中,我可能有一个类,例如,Utility我有一个名为的静态方法changeToCapitalLetter,所以我可以这样做:
Utility.changeToCapitalLetter(myString);
Run Code Online (Sandbox Code Playgroud)
如何在Objective C中执行类似的操作?
非常感谢
gam*_*gul 106
在Objective-C中,您调用此"类方法",请参见此处:
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
Run Code Online (Sandbox Code Playgroud)
该+是最重要的事情; 你调用这样的方法:[MyClass aClassMethod];
She*_*khu 16
来自维基百科:静态方法既不需要类的实例也不能隐式访问此类实例的数据(或此类,自我,我等).
这准确地描述了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];
}
Run Code Online (Sandbox Code Playgroud)
调用classOrInstanceMethod的哪个版本取决于obj是类对象还是实例.如果您熟悉工厂类模式,则此模式是Objective-C语言的一部分.
底线是静态方法和类方法是非常不同的.虽然这种差异对于日常编码目的而言大部分是透明的,但仍然存在知道类方法如何工作的情况可以为您节省大量不必要的代码行.