Из Википедии : Статические методы также не требуют экземпляра
класс, и они не могут неявно получить доступ к данным (или это, я, Я,
и т. д.) такого экземпляра.
Это точно описывает методы класса Objective-C.
Для метода класса Objective-C очень требуется экземпляр, который является целью вызова метода. То есть требуется экземпляр метакласса, который описывает вызываемый объект класса.
В отличие от статических методов, методы класса Objective-C могут быть унаследованы (что, в сочетании с вышеупомянутым self, именно поэтому многие классы могут совместно использовать одну простую реализацию + 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];
}
какая версия classOrInstanceMethod вызывается, зависит от того, является ли объект объектом класса или экземпляром. Если вы знакомы с шаблоном фабричного класса, этот шаблон является частью языка Objective-C.
Суть в том, что статические методы и методы класса очень разные. Хотя это различие в основном прозрачно для повседневного кодирования, все еще существуют ситуации, когда знание того, как работают методы класса, может сэкономить вам массу ненужных строк кода.
Оригинальные ссылки здесь и здесь