Как я могу сделать статический метод в Objective-C? - PullRequest
35 голосов
/ 22 апреля 2010

В Java у меня может быть класс, например, Utility, и у меня есть статический метод с именем changeToCapitalLetter, поэтому я могу сделать что-то вроде этого:

Utility.changeToCapitalLetter(myString);

Как я могу сделатьпохожая вещь в Objective C?

Большое спасибо

Ответы [ 2 ]

101 голосов
/ 22 апреля 2010

В Objective-C вы называете это "методы класса", см. здесь :

@interface MyClass : NSObject

+ (void)aClassMethod;
- (void)anInstanceMethod;

@end

+ - важная вещь; Вы вызываете метод следующим образом: [MyClass aClassMethod];

16 голосов
/ 18 марта 2014

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

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

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

Оригинальные ссылки здесь и здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...