使用ARC时,属性值在被赋予非零值后自动设置为nil

时间:2014-02-21 02:01:06

标签: objective-c macos properties automatic-ref-counting null

在编写Mac OS X程序时我正在使用ARC,而且我遇到了一个有趣的问题。我的.h文件包含以下行:

@property Profile *profile;

 (void) setProfile:(Profile *) newProfile;

 (Profile *) profile;

,变量配置文件在.h中声明如下:

Profile *profile;

我的.m文件具有以下属性实现:

(void) setProfile:(Profile *) newProfile
{
    profile = newProfile;

    if (profile)
    {
        [profileNameTextField setStringValue:profile.name];        
    }
 }

(Profile *) profile
{
    return profile;
}

方法setProfile工作得很好,配置文件设置为非零值。问题是,当.m文件中的某些其他方法尝试访问配置文件时,配置文件为nil。有谁知道我可能做错了什么?我改变了

@property Profile *profile;

@property (nonatomic, strong) Profile *profile;

仍然没有运气。谢谢大家。

1 个答案:

答案 0 :(得分:0)

我的猜测是变量名称存在冲突。拥有一个属性并且它的支持ivar具有相同的名称是一种不好的做法。我不是10%肯定,但你的代码可能被解释为有两个不同的“个人资料”成员。

如果在您的代码中使用

 x = profile;  // access to the variable
 x = self.profile // access the property

通常支持该属性的变量以_为前缀,因此默认情况下,属性profile由一个名为_profile的变量支持。

您可以使用@synthesize关键字显式设置支持变量来覆盖默认行为。

我只会删除profile变量并离开该属性。同样在getter和setter中替换profile _profile,如果编译器仍然抱怨,请使用@synthesize。