статические переменные в Objective-C - что они делают? - PullRequest
30 голосов
/ 11 февраля 2011

Я видел несколько постов, в которых обсуждается, что такое статическая переменная, и я думаю, что получу ее - но я бы хотел быстро написать (или найти) программу, которая использует как обычную, так и статическую переменную, бок о бок и посмотреть, как / когда они работают по-другому. Некоторый быстрый и грязный код, может быть, два int-типа и пара операторов отслеживания NSLog, чтобы увидеть, КАК они различны.

Кто-нибудь получил какие-нибудь советы / идеи / код, которые бы иллюстрировали, как статическая переменная отличается от обычной?

Ответы [ 3 ]

126 голосов
/ 11 февраля 2011

И в 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.

2 голосов
/ 11 февраля 2011

статика работает в основном как в C.

  1. Он может инициализировать переменную только один раз.

  2. Объявление статической переменной в файле выше @implementation блок будет доступен только для всего файла.

1 голос
/ 11 декабря 2013

«статический» относится больше к атрибутам переменной (кто что где), а не только к значению. В отличие от других языков, где это относится исключительно к значению.

  • Sticky

Это похоже на закрепление переменной в определенном месте, будь то внутри функции или в реализации.

  • Частный

Он имеет атрибуты, аналогичные «частным», в том смысле, что он невидим для братьев и сестер или родителей, но дети могут получить к ним доступ.

  • Классный

Это объявление со значением по умолчанию. Как и в других языках, где вы определяете переменные внутри класса и присваиваете им значение по умолчанию:

private int myNumber = 3;

Это дает нам "классоподобные" переменные внутри функций. Объявите их один раз, затем, когда функция манипулирует значением, значение сохраняется. При следующем вызове функции значение будет таким же, как и после предыдущего «цикла», так же, как вы ожидаете, что значение переменной класса останется после манипуляции.

...