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