Как в 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 нет переменных класса (в других языках, таких как Java, они есть). Например, предположим, что вы хотите лениво инициализировать объект и вернуть только этот объект. Вы можете увидеть это:
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.
person
mipadi
schedule
11.02.2011