В чем разница между "методом класса" и "статическим методом"? - PullRequest
33 голосов
/ 11 ноября 2011

Я работал с несколькими разными языками, такими как Java, C # и Objective-C.

В большинстве языков методы, которые не требуют экземпляра объекта, называются статическими методами.Однако когда дело доходит до Objective-C, некоторые люди начинают защищаться, когда вы называете их статическими методами, и ожидают, что вы будете вызывать их методами класса.

Почему они называются методами класса, а не статическими методами?В чем разница между статическим методом и методом класса?

Ответы [ 4 ]

72 голосов
/ 11 ноября 2011

Итак, мой вопрос: почему они называются методами класса, а не статическим методом?В чем разница между статическим методом и методом класса?

Из Википедии: Статические методы не требуют экземпляра класса и не могут неявно обращаться к данным (или к ним, 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 ...
}    
4 голосов
/ 12 марта 2013

Потому что он динамически связан, а не статичен.

Потому что это действительно метод экземпляра объекта класса.

Метод класса Objective C фактически является методом экземпляра объекта класса объекта.

Трудно описать текстом. Смотрите красивую иллюстрацию здесь.

http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.html

4 голосов
/ 11 ноября 2011

Хотя методы класса и статические методы в большинстве случаев одинаковы, они различны.Со статическими методами класс действует как спецификатор пространства имен.С методами класса сам класс является объектом, и поэтому методы класса относятся к объекту класса точно так же, как методы экземпляра к экземпляру;как следствие, вы можете сделать следующее

@interface TestClass : NSObject
+ (void)classOrInstanceMethod;
- (void)classOrInstanceMethod;
@end
...
NSArray * arr = [NSArray arrayWithObjects:
                        [[[TestClass alloc] init] autorelease],
                        [TestClass class],
                        nil];
for( id obj in arr )
    [obj classOrInstanceMethod];

, какая версия classOrInstanceMethod вызывается, зависит от того, является ли obj объектом класса или и экземпляром.Если вы знакомы с шаблоном фабричного класса, этот шаблон является частью языка Objective-C.

1 голос
/ 11 ноября 2011

Это чисто историческое различие, в основном проистекающее из того факта, что Objective-C был разработан одновременно с C ++, а до C ++ или более поздних языков, таких как Java и C #, имели большое влияние. Objective-C был, по сути, портом объектной модели Smalltalk на C, поэтому его синтаксис и терминология не обязательно должны выглядеть как «C-like», как в C ++. Однако Objective-C никоим образом не противодействовал тенденции, не используя термин «статический метод», потому что эта тенденция не была устоявшейся в 1983 году.

...