Область действия статической переменной в классе? - PullRequest
0 голосов
/ 10 марта 2010

Может кто-нибудь сказать мне, какова область действия статической переменной в классе ниже?

@implementation SharedManager

static id myInstance = nil;

+(id)sharedInstance {
    if(myInstance == nil) {
        myInstance = [[self alloc] init];
    }
    return myInstance;
}

В тесте я создал экземпляр из класса, а затем выпустил его, но заметил, что при создании второго экземпляра статическое значение не равно нулю (т. Е. Указывает на ранее освобожденный объект). Для теста я исправил это, переопределив - (недействительно) Deloc для класса.

-(void)dealloc {
    NSLog(@”_deal: %@”, [self class]);
    [super release]
    myInstance = nil
}

1007 * Гэри *

Ответы [ 2 ]

1 голос
/ 10 марта 2010

Область действия ограничена самим классом "SharedManager" (поскольку он объявлен в разделе @implementation, он не будет виден подклассам).

duration переменной является "статической", что означает, что есть одна копия переменной, связанной с самим классом; он не создается / уничтожается при выделении / освобождении экземпляров класса.

Также; если ваш класс предназначен для работы с потоками, вы должны выполнить

@synchronized(self) {
if (myInstance == nil) {
    myInstance = [[self alloc] init];
}

к вашему методу sharedInstance, чтобы обработать случай, когда два потока одновременно вызывают sharedInstance.

0 голосов
/ 10 марта 2010

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

В других новостях вы можете писать функции C в блоке @implementation - они будут работать как обычные функции C.

В ObjC, AFAIK нет понятия "статические переменные класса". Это не C ++.

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