Итак, мой вопрос: почему они называются методами класса, а не статическим методом? В чем разница между статическим методом и методом класса?
Из Википедии: Статические методы не требуют экземпляра класса и не могут неявно обращаться к данным (или this, self, Me и т. Д.) Такого экземпляра.
Это точно описывает, чем методы класса 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 ...
}
person
bbum
schedule
11.11.2011
Class
экземпляров (например,+[NSObject class]
), которые сами по себе являются полноценными объектами со своими собственными методами. - person Sedate Alien   schedule 11.11.2011