И в C, и в Objective-C переменная static - это переменная, которая выделяется на весь срок жизни программы.Это отличается от автоматических переменных, время жизни которых существует во время одного вызова функции;и динамически распределяемые переменные, такие как объекты, которые могут быть освобождены из памяти, когда они больше не используются.Проще говоря, значение статической переменной поддерживается во всех вызовах функций / методов.При объявлении вне функции статическая переменная видна всему, что находится в файле, в котором она объявлена;будучи объявленным внутри функции или метода, он виден только внутри этой функции или метода, но значение сохраняется между вызовами.
Скажем, у вас есть это:
int f(void)
{
int i = 5;
i += 10;
return i;
}
Каждый вызов f()
вернет значение 15
.
Теперь скажем, что у вас есть это:
int g(void)
{
static int i = 5;
i += 10;
return i;
}
При первом вызове g()
будет возвращено значение 15
.Во второй раз будет возвращено 25
, поскольку i
сохранит значение 15
, а затем увеличится на 10
.Третий звонок 35
будет возвращен.И т. Д.
В контексте классов Objective-C статические переменные часто используются для имитации переменных класса , поскольку Objective-C не имеет переменных класса (в других языках, таких какЯва, делай).Например, скажем, вы хотите лениво инициализировать объект и только возвращать этот объект.Вы можете увидеть это:
static MyObject *obj = nil;
@implementation MyObject
+ (id)sharedObject
{
if (obj == nil) obj = [[MyObject alloc] init];
return obj;
}
@end
obj
будет инициализирован при первом вызове classObject
;последующие вызовы classObject
вернут тот же объект.Вы можете проверить это, зарегистрировав адрес объекта:
NSLog(@"obj is at %p", [MyObject sharedObject]);
NSLog(@"obj is at %p", [MyObject sharedObject]); // Will print the same address both times
Кроме того, obj
будет виден всем методам в MyObject
.
Этот метод используется для реализации синглтонатакже классы в Objective-C.