2013-09-10 4 views
1

Я следую за книгой Big Nerd Ranch по программированию iOS.Проблема с пониманием статического класса в iOS

Существует образец статического класса:

#import <Foundation/Foundation.h> 

@interface BNRItemStore : NSObject 

+ (BNRItemStore *) sharedStore; 

@end 

У меня есть проблема undrstanding бит ниже со знаком вопроса в комментариях. Если я попытаюсь выделить этот класс, метод overriden приведет меня к sharedStore, который, в свою очередь, устанавливает статический указатель sharedStore на нуль. Условное значение после этого произойдет впервые, потому что указатель не существует.

Идея состоит в том, что во второй раз, когда я нахожусь на том же месте, он не будет выделять новый экземпляр и вместо этого получить существующий экземпляр. Однако с static BNRItemStore *sharedStore = nil; Я устанавливаю указатель на нуль и уничтожаю его, не так ли? Следовательно, каждый раз, когда я создаю непреднамеренно новый экземпляр, нет?

#import "BNRItemStore.h" 

@implementation BNRItemStore 

+ (BNRItemStore*) sharedStore 
{ 
    static BNRItemStore *sharedStore = nil; // ??? 
    if (!sharedStore) { 
     sharedStore = [[super allocWithZone:nil] init]; 
    } 
    return sharedStore; 
} 

+(id)allocWithZone:(NSZone *)zone 
{ 
    return [self sharedStore]; 
} 

@end 
+0

У вас есть так называемый шаблон «singleton». Самая запутанная часть состоит в том, что инструкция, начинающаяся с 'static', не выполняется как часть метода-оболочки, но выполняется только один раз, когда класс загружается. –

+1

(Надеюсь, книга на самом деле не называет это «статическим классом».) –

ответ

1

Однако с static BNRItemStore *sharedStore = nil; я устанавливаю указатель на nil и уничтожить его, не так ли?

Нет, вы не установите его nil: выражение в static инициализаторе вычисляется только один раз; второй раз вокруг инициализации не действует. Это выглядит очень запутанным, но это то, как функция-статическое средство работает в C (и, в дополнение, в Objective-C).

Попробуйте это в качестве примера:

int next() { 
    static int current = 123; 
    return current++; 
} 

int main(int argc, char *argv[]) { 
    for (int i = 0 ; i != 10 ; i++) { 
     NSLog(@"%d", next()); 
    } 
    return 0; 
} 

Это создаст последовательность увеличения числа, начиная с 123, даже если код делает вид, как будто current присваивается 123 каждый раз, когда вы идете через функцию ,

+0

Вот [демонстрация последнего примера на ideone] (http://ideone.com/GJovJd). – dasblinkenlight

Смежные вопросы