Ответ 1
В Objective-C вы называете это "методы класса", см. здесь:
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
+ - важная вещь; вы вызываете метод следующим образом: [MyClass aClassMethod];
В Java у меня может быть класс, например, Utility
, и у меня есть статический метод changeToCapitalLetter
, поэтому я могу сделать что-то вроде этого:
Utility.changeToCapitalLetter(myString);
Как я могу сделать подобное в Objective C?
Спасибо большое
В Objective-C вы называете это "методы класса", см. здесь:
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
+ - важная вещь; вы вызываете метод следующим образом: [MyClass aClassMethod];
Материал из Википедии. Статические методы не требуют экземпляра класса, и они не могут имплицитно обращаться к данным (или это, я, Я, и т.д.) такого экземпляра.
Это точно описывает, что не методы класса Objective-C.
Метод класса Objective-C очень необходим для экземпляра, который является объектом вызова метода. То есть для этого требуется экземпляр метакласса, описывающий вызываемый объект класса.
В отличие от статических методов, методы класса Objective-C могут быть наследованы (что в сочетании с наличием вышеупомянутого "я" именно поэтому многие классы могут совместно использовать одну, простую реализацию + alloc в NSObject, не требуя собственных пользовательских реализаций ) и вызов метода класса проходит через тот же механизм отправки на основе 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];
}
какая версия классаOrInstanceMethod вызывается, зависит от того, является ли obj объектом класса или экземпляром. Если вы знакомы с шаблоном класса factory, этот шаблон является частью языка Objective-C.
Суть в том, что статические методы и методы класса очень разные. Хотя эта разница в основном прозрачна для повседневных целей кодирования, все еще существуют ситуации, когда знание того, как работают методы класса, может сэкономить массу ненужных строк кода.