我正在关注关于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
答案 0 :(得分: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。