web-dev-qa-db-fra.com

Comment créer une méthode statique en Objective-C?

En Java, je peux avoir une classe, par exemple, Utility et j'ai une méthode statique appelée changeToCapitalLetter, donc je peux faire quelque chose comme ceci:

Utility.changeToCapitalLetter(myString);

Comment puis-je faire la même chose dans l'objectif C?

Merci beaucoup

36
Tattat

Dans Objective-C, vous appelez cela "méthodes de classe", voir ici :

@interface MyClass : NSObject

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

@end

Le + est la chose importante; vous appelez la méthode comme ceci: [MyClass aClassMethod];

102
gammelgul

Wikipédia : les méthodes statiques ne nécessitent pas d'instance de la classe et ne peuvent pas accéder implicitement aux données (ou ceci, self, Me, etc.) de telles une instance.

Ceci décrit exactement ce que les méthodes de classe d'Objective-C ne sont pas.

Une méthode de classe Objective-C nécessite beaucoup une instance qui est la cible de l'appel de méthode. Autrement dit, il nécessite une instance de la métaclasse qui décrit l'objet de classe appelé.

Contrairement aux méthodes statiques, les méthodes de classe d'Objective-C peuvent être héritées (ce qui, en combinaison avec le soi susmentionné, est exactement la raison pour laquelle de nombreuses classes peuvent partager une implémentation unique et simple de + alloc sur NSObject sans avoir besoin de leurs propres implémentations personnalisées) et invoquer une méthode de classe passe par le même mécanisme de répartition basé sur objc_msgSend * que tout autre site d'appel de méthode.

Les méthodes de classe d'Objective-C peuvent être remplacées dans la hiérarchie des classes et peuvent être accélérées. Aucun n'est pris en charge dans les langages qui proposent généralement des méthodes statiques à la place des méthodes de classe.

Bien que les méthodes de classe et la méthode statique soient en pratique la plupart du temps les mêmes, elles sont différentes. Avec les méthodes statiques, la classe agit comme un qualificatif d'espace de noms. Avec les méthodes de classe, la classe elle-même est un objet et donc les méthodes de classe sont à l'objet de classe exactement la même chose que les méthodes d'instance sont à une instance, en conséquence, vous pouvez faire ce qui suit

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

la version de classOrInstanceMethod appelée dépend de si obj est un objet de classe ou une instance. Si vous connaissez le modèle de classe d'usine, ce modèle fait partie du langage Objective-C.

L'essentiel est que les méthodes statiques et les méthodes de classe sont très différentes. Bien que cette différence soit principalement transparente à des fins de codage au jour le jour, il existe encore des situations où la connaissance du fonctionnement des méthodes de classe peut vous faire économiser une tonne de lignes de code inutiles.

Liens d'origine ici et ici

16
Shekhu