无法理解iOS中的静态类

时间:2013-09-10 16:41:26

标签: ios static

我正在关注关于iOS编程的Big Nerd Ranch书。

有一个静态类的示例:

#import <Foundation/Foundation.h>

@interface BNRItemStore : NSObject

+ (BNRItemStore *) sharedStore;

@end

我有一个问题,在评论中用问号标记下面的位。 如果我尝试分配这个类,则overriden方法会将我带到sharedStore,后者又将静态指针sharedStore设置为nil。由于指针不存在,条件后将首次点击。

我的想法是,第二次我在同一个地方时,它不会分配新实例而是获取现有实例。但是使用static BNRItemStore *sharedStore = nil;我将指针设置为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 

1 个答案:

答案 0 :(得分:1)

  

然而,对于static BNRItemStore *sharedStore = nil;,我将指针设置为nil并将其销毁,不是吗?

不,您没有将其设置为nilstatic初始化程序中的表达式只计算一次;第二次初始化没有任何影响。这看起来很混乱,但这是函数静态工具在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。