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

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

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

#include "MyClass.h"

@implementation MyClass
int myInt;
...
@end

и

#include "MyClass.h"

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

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

Ответ 1

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

Ответ 2

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

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

Статические локальные переменные:
Когда вы используете статический модификатор для локальной переменной, функция "запоминает" ее значение для всех вызовов. Например, переменная currentCount в следующем фрагменте никогда не получает reset, поэтому вместо хранения счетчика в переменной внутри 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 не влияет на область локальных переменных. Подробнее о статическое ключевое слово.

Ответ 3

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

Ответ 4

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

Ознакомьтесь с полным объяснением здесь:

fooobar.com/info/7852/...