使用 ARC 时,属性值在分配非 nil 值后会自动设置为 nil



我在编写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效果很好,配置文件设置为非nil值。 问题是,当 .m 文件中的其他方法尝试访问配置文件时,配置文件为 nil。 有谁知道我可能做错了什么? 我变了

@property Profile *profile;

@property (nonatomic, strong) Profile *profile;

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

我的猜测是变量名称存在冲突。拥有一个属性是一种不好的做法,它支持 ivar 具有相同的名称。我不是 10% 确定,但您的代码可能会被解释为具有两个不同的"配置文件"成员。

如果在代码中使用

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

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

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

我只会删除profile变量并保留该属性。还要替换 getter 和 setter 中的 profile _profile,如果编译器仍然抱怨,请使用 @synthesize。

相关内容

  • 没有找到相关文章