在编写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;
仍然没有运气。谢谢大家。
答案 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。