1

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

有一个静态类的示例:

#import <Foundation/Foundation.h>

@interface BNRItemStore : NSObject

+ (BNRItemStore *) sharedStore;

@end

我在理解下面带有问号的评论时遇到了问题。如果我尝试分配这个类,被覆盖的方法会将我带到sharedStore,这反过来又将静态指针设置sharedStore为 nil。由于指针不存在,条件 after 将第一次命中。

这个想法是,我第二次在同一个地方时,它不会分配新实例而是获取现有实例。但是,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 
4

1 回答 1

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。

于 2013-09-10T16:45:09.510 回答