5

我来自 C# 开发,刚刚开始学习 Objective-C 和 Xcode 4。据我了解,如果您不需要检查/控制以下值,“@synthesize”正在替换属性的 getter/setter 方法被读或写。

但是为什么 Xcode 4 会自动为我创建一个实例变量呢?

这还不够吗:

@synthesize myProperty;

代替:

@synthesize myProperty = _myProperty;

?

如果我没有/不需要任何 getter 或 setter,我为什么要使用/拥有实例变量而不是实际属性?

提前致谢!

孟菲斯

编辑:

我知道@synthesize 正在取代 getter/setter,但这部分有什么好处:= _myProperty;?如果我可以直接使用“myProperty”,为什么还要有一个实例变量?如果设置器例如检查值的条件,我会理解使用“_myProperty”。如果我想跳过这个检查,我会使用 _myProperty。但是当我使用@synthesize 时,我没有一个设置器来做一些检查。那么为什么我有/想要一个实例变量呢?

回答:

请参阅 MattyG 帖子中的评论!

4

2 回答 2

14

这是一个约定,用于提醒程序员通过带有 self 的 setter 和 getter 来访问实例变量。因此,如果您正在使用:

@synthesize myProperty = _myProperty;

然后要直接访问变量,您必须编写:

_myProperty = something;

要通过它的设置器访问变量,您必须编写:

self.myProperty = something;

这样做的好处是,如果您忘记通过自我访问。然后编译器会警告你:

myProperty = something;  //this won't compile

另请参阅此问题

于 2011-11-07T02:24:33.250 回答
-2

好吧,您在 .h 文件中声明属性的实例变量以及属性本身。属性的接口以及它将使用的实例变量已经建立了......它的实现还没有。这就是 @synthesize 关键字的用武之地。它只是为您实现属性,因此您不必自己写出来。

以下是在 C# 中声明属性的方法

private int _int1;
public int int1 {
  get { return _int1; }
  set { _int1 = value; }
}

这是一段非常常见的代码,C# 允许您对其进行缩写以避免一遍又一遍地键入相同的内容

public int int1 { get; set; }

这两个代码段的区别在于后者不存在私有变量“_int1”,因为C#在内部创建了一个变量。@synthesize 关键字很好,因为它省去了一遍又一遍地编写相同代码的麻烦,同时仍然允许您访问它所基于的实例​​变量。

编辑。还需要注意的是,getter 和 setter 确实存在于 Objective C 中。它们的名称与 C# 中的名称不同,在 C# 中它们被标记为 get{} 和 set{}。在 Objective C 中,getter 是一个与其实例变量同名的方法,而 setter 是一个方法,其中单词 'set' 后跟实例变量名称,第一个字母大写。

所以,假设你的 .h 文件中有这个

int myVar;
...
@property(nonatomic, assign) int myVar;

您可以在 .m 文件中自己实现 getter 和 setter

-(int)myVar {
  return myVar;
}

-(void)setMyVar:(int)newVar {
  myVar = newVar;
}

或者您可以使用 @synthesize 自动编写 getter 和 setter

于 2011-11-07T02:26:41.353 回答