Ответ 1
Ключевое слово "static" в этом контексте такое же, как и в обычном C: он ограничивает область myInt текущим файлом.
Я не совсем понимаю статические переменные, если они определены в реализации интерфейса. В методах я понимаю, как они отличаются от локальных переменных, но не тогда, когда они определены непосредственно в реализации.
Посмотрите на эти примеры. Какая разница между этими двумя способами?
#include "MyClass.h"
@implementation MyClass
int myInt;
...
@end
и
#include "MyClass.h"
@implementation MyClass
static int myInt;
...
@end
myInt
в обоих случаях видим для всех методов, и если я интерпретировал тест, я работал правильно, myInt
в обоих случаях будет той же переменной для разных экземпляров класса.
Ключевое слово "static" в этом контексте такое же, как и в обычном C: он ограничивает область myInt текущим файлом.
К сожалению, он имеет разные эффекты в зависимости от того, где вы его используете.
Статические функции:
По умолчанию все функции имеют глобальную область действия. Статический спецификатор позволяет ограничить область функций текущим файлом.
Статические локальные переменные:
Когда вы используете статический модификатор для локальной переменной, функция "запоминает" ее значение для всех вызовов. Например, переменная 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 не влияет на область локальных переменных. Подробнее о статическое ключевое слово.
Из Apple "Язык программирования Objective-C": "Объявление переменной static ограничивает ее область видимости только классом - и только той частью класса, которая реализована в файле. (Таким образом, в отличие от переменных экземпляра, статические переменные не может быть унаследован подклассами или под ними напрямую".
"В C и Objective-C статическая переменная представляет собой переменную, которая выделяется для всего жизненного цикла программы. Это отличается от автоматических переменных, срок жизни которых существует во время одного вызова функции, и динамически распределенных переменные, такие как объекты, которые могут быть освобождены из памяти, когда они больше не используются. Проще говоря, значение статической переменной поддерживается во всех вызовах функций/методов. При объявлении вне функции статическая переменная видна для всего внутри файла в который он объявлен, когда он объявлен внутри функции или метода, он виден только внутри этой функции или метода, но значение сохраняется между вызовами."
Ознакомьтесь с полным объяснением здесь: