类中的静态变量范围?

时间:2010-03-10 16:40:16

标签: iphone objective-c cocoa-touch

谁能告诉我下面这个类中静态变量的范围是什么?

@implementation SharedManager

static id myInstance = nil;

+(id)sharedInstance {
    if(myInstance == nil) {
        myInstance = [[self alloc] init];
    }
    return myInstance;
}

在测试中我从类中创建了一个实例,然后将其释放,但注意到在创建第二个实例时静态不是nil(即指向先前释放的对象)对于测试我通过覆盖修复了这个问题 - (void)该课程的dealloc。

-(void)dealloc {
    NSLog(@”_deal: %@”, [self class]);
    [super release]
    myInstance = nil
}

加里

2 个答案:

答案 0 :(得分:1)

变量的范围仅限于“SharedManager”类本身(因为它在@implementation部分中声明,它对于子类是不可见的。)

变量的持续时间是“静态”,意味着有一个与类本身关联的变量副本;当你分配/解除该类的实例时,它不会被创建/销毁。

也;如果你的课程是为了线程安全,你应该做

@synchronized(self) {
if (myInstance == nil) {
    myInstance = [[self alloc] init];
}

到您的sharedInstance方法,以处理同时调用sharedInstance的两个线程的情况。

答案 1 :(得分:0)

据我了解,该变量的可见范围低于当前源文件中的声明,并且生命周期是全局的。好像它是一个C静态变量。

在其他新闻中,您可以在@implementation块中编写C函数 - 它们将像常规C函数一样工作。

ObjC,AFAIK中没有“类静态”变量的概念。这不是C ++。