2015-11-15 104 views
-1

我有一个用于存储其他类的实例对象的类。这个类有以下类方法被称为每当我需要得到的类本身(和存储其他类的实例,其方法是对数据结构进行操作的数据结构):Objective C中的静态初始化C

+ (instancetype)sharedStore 
{ 
static BNRItemStore *sharedStore = nil; 

//Do I need to create a sharedStore? 
if (!sharedStore) { 
    sharedStore = [[self alloc] initPrivate]; 
} 

return sharedStore; 
} 

static BNRItemStore *sharedStore = nil;行对我来说非常混乱。第一次调用类方法时,我们声明static BNRItemStore *sharedStore并将其设置为nil。我不明白为什么如果我们第二次调用该方法,sharedStore不会被覆盖和/或释放。显然,这种情况从未发生过,所有后续调用+ (instancetype)sharedStore()方法似乎都完全忽略了static BNRItemStore *sharedStore = nil;这一行。这是为什么?

+1

这是因为四十年的静态变量规则。初始化发生_once_。 – gnasher729

回答

2

静态

最后,一个大家的肯定承认:静态的。

作为一个关键字,静态被用于很多不同的,不兼容的方式,所以在每个实例中确切地说明它的含义可能会令人困惑。说到存储类,静态意味着两件事之一。

方法或函数内的静态变量在调用之间保留其值。 全局声明的静态变量可以通过任何函数或方法调用,只要这些函数与静态变量在同一个文件中出现。静态功能也是如此。 Static Singletons

Objective-C中的常见模式是静态单例,其中静态声明的变量被初始化并返回到函数或类方法中。调度一旦被用来保证变量在一个线程安全的方式初始化恰好一次:

+ (instancetype)sharedInstance { 
    static id _sharedInstance = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     _sharedInstance = [[self alloc] init]; 
    }); 

    return _sharedInstance; 
} 

单元素模式是用于创建在跨越整个应用程序共享对象,诸如HTTP客户端或一个有用通知管理器,或者可能造价昂贵的对象,例如格式化程序。

来源:http://nshipster.com/c-storage-classes/

0

Objective C没有实现类实例变量。静态声明使sharedStore永久保留,但限制了它的访问(与在类之外声明它相比)。所以只有一个sharedStore,它只被初始化一次。后续调用该方法只需访问sharedStore,它们不会创建新版本(也不会重新初始化它)。