web-dev-qa-db-fra.com

Quelle est la signification des variables statiques dans une implémentation d'une interface?

Je ne comprends pas très bien les variables statiques quand elles sont définies dans l'implémentation d'une interface. Dans les méthodes, je comprends en quoi elles diffèrent des variables locales, mais pas lorsqu'elles sont définies directement dans une implémentation.

Regardez ces exemples. Quelle différence ces deux-là font-ils pratiquement?

#include "MyClass.h"

@implementation MyClass
int myInt;
...
@end

Et:

#include "MyClass.h"

@implementation MyClass
static int myInt;
...
@end

myInt est dans les deux cas visible par toutes les méthodes, et si j'ai interprété un test correctement, myInt sera dans les deux cas la même variable pour différentes instances de la classe.

68
quano

Le mot-clé 'statique' dans ce contexte est le même que dans le cas de C: il limite la portée de myInt au fichier actuel.

68
smorgan

Malheureusement, il a des effets différents selon l'endroit où vous l'utilisez.

Fonctions statiques:
Par défaut, toutes les fonctions ont une portée globale. Le spécificateur statique vous permet de limiter la portée de la fonction au fichier actuel.

Variables locales statiques:
Lorsque vous utilisez le modificateur statique sur une variable locale, la fonction "se souvient" de sa valeur à travers les invocations. Par exemple, la variable currentCount dans l'extrait de code suivant n'est jamais réinitialisée, donc au lieu de stocker le nombre dans une variable à l'intérieur de main (), nous pouvons laisser countByTwo () faire l'enregistrement pour nous.

// main.m
#import <Foundation/Foundation.h>

int countByTwo() {
    static int currentCount = 0;
    currentCount += 2;
    return currentCount;
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog(@"%d", countByTwo());    // 2
        NSLog(@"%d", countByTwo());    // 4
        NSLog(@"%d", countByTwo());    // 6
    }
    return 0;
}

Cette utilisation du mot clé statique n'affecte pas la portée des variables locales.
En savoir plus sur le mot-clé statique .

85
appsunited

"En C et en Objective-C, une variable statique est une variable qui est allouée pour toute la durée de vie d'un programme. Cela contraste avec les variables automatiques, dont la durée de vie existe pendant un seul appel de fonction; et les variables allouées dynamiquement comme les objets , qui peut être libérée de la mémoire lorsqu'elle n'est plus utilisée. Plus simplement, la valeur d'une variable statique est conservée tout au long de tous les appels de fonction/méthode. Lorsqu'elle est déclarée en dehors d'une fonction, une variable statique est visible par tout dans le fichier dans lequel elle se trouve. déclarée; lorsqu'elle est déclarée dans une fonction ou une méthode, elle n'est visible que dans cette fonction ou cette méthode, mais la valeur est conservée entre les appels. "

Découvrez l'explication complète ici:

https://stackoverflow.com/a/4965145/951349

20
smileBot

Extrait du "langage de programmation Objective-C" d'Apple: "La déclaration d'une variable statique limite sa portée à la classe uniquement - et à la partie de la classe implémentée dans le fichier (ainsi, contrairement à l'instance variables, les variables statiques ne peuvent pas être héritées par, ou directement manipulées par, des sous-classes). "

16
c roald