Подтвердить что ты не робот

Какая разница между "методом класса" и "статическим методом"?

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

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

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

4b9b3361

Ответ 1

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

Из Википедии: Статические методы не требуют экземпляра класса и не могут им неявно обращаться к данным (или это, я, я и т.д.) такого экземпляра.

Это точно описывает, что не методы класса 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 ...
}    

Ответ 2

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

@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];

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

Ответ 3

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

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

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

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

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

Ответ 4

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