在Objective C中的synchronized块中设置实例变量

时间:2011-01-23 08:03:55

标签: objective-c synchronization

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

+(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;
}

为什么会这样?我有一个我需要直接访问的变量(我不想合成该变量)。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:5)

您无法更改实例变量,因为这不是实例方法。事实上,self的值是类本身。您的代码行self.something = @"hello world!"也无效。你真正想要的是sharedInstance.something = @"hello world!",这只有在something属性时才有效。更好的方法是在init方法中设置ivars。

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

假设你正在尝试在这里创建一个单例(就像它的样子一样),你可能想在Obj-C中阅读关于单例的blog post