2010-03-10 151 views
0

任何人都可以告诉我什么下面的类中的静态变量的范围是?类中的静态变量作用域?

@implementation SharedManager 

static id myInstance = nil; 

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

在测试我创建从类的实例,然后释放它,但注意到,在创建第二个实例,静态不是零(即指向先前发布的对象)对于测试我固定这通过覆盖 - (void)dealloc为这个类。

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

加里

回答

1

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

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

另外;如果你的类意图是线程安全的,你应该做的

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

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

+0

谢谢大卫,是的,我明白这一点,但在这种情况下,单例只是模型数据,它是一个简单的MVC iPhone应用程序,我不会预见和线程发生。我只是想确定它是如何工作的,因此不需要dealloc,因为我没有看到它被释放 – fuzzygoat 2010-03-10 17:24:27

+0

只是我的单身旅行中的一个快速记录,@synchronized([SharedManager class]){可能会更好,或者更好我被引导相信。 – fuzzygoat 2010-03-10 17:43:47

0

据我了解,该变量的可见度范围是其当前的源文件中的声明下方,且寿命是全球性的。就好像它是一个C静态变量。

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

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

+0

谢谢,不知道“C函数”位,代码显示“Objective-C类方法”......但我总是可能会错过你的观点。 – fuzzygoat 2010-03-10 16:56:48

+0

因为Objective-C是带有O-O扩展名的C语言,所以你总是可以做简单的旧C语言,再加上你可以混合搭配。 Seva正在谈论的是编写包含Objective-C代码的普通旧C函数。 (关于一些例子,请看Apple的基础函数参考。)Seva指出,这些可以放在.m文件中的任何位置。 – jlehr 2010-03-10 17:17:43

+0

啊,我明白了,谢谢你的澄清。 – fuzzygoat 2010-03-10 17:26:30