статическая BOOL в Objective C - PullRequest
       8

статическая BOOL в Objective C

2 голосов
/ 02 апреля 2009

В следующем коде я создаю категорию на UIColor для создания случайного цвета. Однако из этого кода я бы подумал, что условное «если» будет истинно при каждом запуске метода, а не только в первый раз.

Мне кажется, я не совсем правильно понимаю статические переменные. Статическая переменная устанавливается только один раз, а затем при втором запуске метода эта строка просто игнорируется? (так будет посеянный всегда будет ДА ​​после первого запуска)?

@interface UIColor(Random)
+(UIColor *)randomColor
{
    static BOOL seeded = NO;
    if (!seeded) 
    {
        seeded = YES;
        srandom(time(NULL));
    }
    CGFloat red = (CGFloat)random()/(CGFloat)RAND_MAX;
    CGFloat green = (CGFloat)random()/(CGFloat)RAND_MAX;
    CGFloat blue = (CGFloat)random()/(CGFloat)RAND_MAX;
    return [UIColor colorWithRed:red green:green blue:blue alpha:1.0f];
}

Ответы [ 6 ]

15 голосов
/ 02 апреля 2009

Вы правы, что статическая переменная устанавливается только один раз.

код

static BOOL seeded = NO;

равно не эквивалентно

static BOOL seeded;
seeded = NO;

второй всегда будет оцениваться как NO, тогда как первый будет оцениваться как NO, пока не будет установлен иначе.

4 голосов
/ 02 апреля 2009

Здесь static означает, что текущее значение seeded не теряется от одного вызова метода к следующему. Присвоение в строке объявления определяет только первое значение seeded.

Да, seeded будет всегда YES после первого запуска.

2 голосов
/ 02 апреля 2009

Статическая переменная сохраняет свое значение, когда элемент управления выходит из области действия функции. Таким образом, для сеянцев будет установлено значение, которое оно имело в последний раз. В вашем случае вы инициализируете seed с NO, а затем устанавливаете его на YES. Итак, чтобы ответить на ваш вопрос, да: seedded всегда будет YES после первого вызова этого метода.

1 голос
/ 02 апреля 2009

Статические переменные не выделяются в стеке, как в этом примере ваши красные, зеленые и синие переменные. Они:

  1. Распределяются в памяти в одном неизменном месте,
  2. Использование памяти, даже если содержащая функция никогда не вызывается,
  3. Может вызвать проблемы, когда функция используется в нескольких потоках - хотя ваш пример имеет очень малую вероятность состояния гонки, и
  4. назначаются только один раз; случайно, я не помню, в первый раз ли функция вызывается или когда загружается код (последний, я думаю).

Это может помочь вам думать об этом так, как если бы компилятор перемещал объявление (с присваиванием) вне области действия функции / класса, но доступ ограничен внутри функции.

1 голос
/ 02 апреля 2009

Как уже говорили другие, статические локальные переменные инициализируются определенным значением при создании и сохраняют это значение до тех пор, пока не будут изменены. Статические глобальные переменные, с другой стороны, означают, что они локальны для области видимости файла, то есть недоступны вне текущего исходного файла.

Небольшая история / детализация низкого уровня можно найти на http://en.wikipedia.org/wiki/Block_Started_by_Symbol

0 голосов
/ 02 апреля 2009

эй, вы можете изменять значения статических переменных столько раз, сколько захотите. Причина, по которой ваше утверждение if является истинным только один раз, заключается в том, что вы объявили и присвоили нет в том же утверждении. Попробуйте разделить эти два параметра, чтобы видеть выражение if в каждом запуске

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...