2011-01-23 59 views
0

我有一个同步的函数,但似乎无法直接更改该块中实例变量的值。在目标C中设置同步块中的实例变量C

+(id)allocWithZone:(NSZone *)zone 
{ 
@synchronized(self) { 
    if (sharedInstance == nil) { 
     sharedInstance = [super allocWithZone:zone]; 

     //This is not allowed 
     something = @"hello"; 

     //This is allowed 
     self.something = @"hello world!"; 

     return sharedInstance; 
    } 
} 

return nil; 
} 

为什么会出现这种情况?我有一个需要直接访问的变量(我不想综合该变量)。我如何解决这个问题?

+0

你是什么意思,“不允许”?该代码是否不能编译?触发运行时错误?如果崩溃,你能提供崩溃的具体细节吗? – Tim 2011-01-23 08:06:41

+0

@Darren有很多错误,首先是他正在像一个实例方法那样处理一个类方法,并试图在调用`-init`之前设置ivars。 – 2011-01-23 08:12:55

回答

5

您不能更改实例变量,因为这不是实例方法。实际上,self的价值本身就是这个类。您的代码行self.something = @"hello world!"也不起作用。你真正想要的是sharedInstance.something = @"hello world!",那只有在something是属性的情况下才会起作用。更好的办法是在init方法中设置ivars。

哦,你没有商业设置ivars在+allocWithZone:无论如何。该对象尚未初始化。

假设你正在尝试在这里创建一个singleton(就像它看起来那样),你可能需要在Obj-C的单例中读这个blog post