Итак, мой вопрос: почему они называются методами класса, а не статическим методом?В чем разница между статическим методом и методом класса?
Из Википедии: Статические методы не требуют экземпляра класса и не могут неявно обращаться к данным (или к ним, self,Я и т. Д.) Такого экземпляра.
Это точно описывает то, что методы класса Objective-C не .
Метод класса Objective-C оченьмногое требует экземпляра, который является целью вызова метода.То есть требуется экземпляр метакласса, который описывает вызываемый объект класса.
В отличие от статических методов, методы класса Objective-C могут наследоваться (что в сочетании с вышеупомянутым self
именно поэтому многие классы могут совместно использовать одну простую реализацию +alloc
на NSObject
без необходимости собственных пользовательских реализаций), а вызов метода класса проходит через тот же механизм диспетчеризации на основе objc_msgSend*
, что и любой другой сайт вызова метода.
Методы класса Objective-C могут быть переопределены по всей иерархии классов, и их можно быстро изменить.Ни один из них не поддерживается в языках, которые обычно предлагают статические методы вместо методов класса.
Суть в том, что статические методы и методы класса очень отличаются .Хотя эта разница в основном прозрачна для повседневного кодирования, все еще существуют ситуации, когда знание методов работы класса может сэкономить вам массу ненужных строк кода.
Например, вы не можете сделать это сстатические методы:
@interface AbstractClass:NSObject
+ factory;
@end
@implementation AbstractClass
+ factory
{
return [[[self alloc] init] autorelease];
}
@end
@interface Concrete1:AbstractClass
@end
@implementation Concrete1
@end
@interface Concrete2:AbstractClass
@end
@implementation Concrete2
@end
void foo() {
Concrete1 *c = [Concrete1 factory];
Concrete2 *d = [Concrete2 factory];
... etc ...
}