В чем смысл статических переменных в реализации интерфейса?


Я не совсем понимаю статические переменные, когда они определены в реализации интерфейса. В методах я понимаю, как они отличаются от локальных переменных, но не тогда, когда они определены непосредственно в реализации.

посмотрите на эти примеры. Какая разница между этими двумя практически?

#include "MyClass.h"

@implementation MyClass
int myInt;
...
@end

и:

#include "MyClass.h"

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

myInt в обоих случаях виден для всех методов, и если я правильно интерпретировал тест, который я выполнил,myInt будет в обоих случаях быть одной и той же переменной для разных экземпляров класса.

4 67

4 ответа:

ключевое слово "static" в этом контексте такое же, как и в обычном C: оно ограничивает область действия myInt текущим файлом.

к сожалению, он имеет различные эффекты в зависимости от того, где вы используете его.

Статические Функции:
По умолчанию все функции имеют глобальную область действия. Статический спецификатор позволяет ограничить область действия функции текущим файлом.

Статические Локальные Переменные:
Когда вы используете статический модификатор для локальной переменной, функция "запоминает"его значение при вызовах. Например, переменная currentCount в следующем сниппет никогда не сбрасывается, поэтому вместо того, чтобы хранить счетчик в переменной внутри main (), мы можем позволить countByTwo() делать запись за нас.

// 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;
}

использование ключевого слова static не влияет на область видимости локальных переменных.
Узнайте больше о static ключевое слово.

" как в C, так и в Objective-C статическая переменная-это переменная, которая выделяется на весь срок службы программы. Это в отличие от автоматических переменных, чье время жизни существует во время одного вызова функции; и динамически выделяемых переменных, таких как объекты, которые могут быть освобождены из памяти, когда они больше не используются. Проще говоря, значение статической переменной сохраняется во всех вызовах функций/методов. При объявлении вне функции статическая переменная видна все в файле, в котором он объявлен; при объявлении внутри функции или метода он виден только внутри этой функции или метода, но значение сохраняется между вызовами."

посмотреть полное объяснение здесь:

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

от Apple "язык программирования Objective-C": "объявление переменной static ограничивает его область только классом -- и только частью класса, который реализован в файле. (Таким образом, в отличие от переменных экземпляра, статические переменные не могут наследоваться подклассами или непосредственно управляться ими)."