关于C#:为什么Xcode 4会自动生成一个实例变量?

Why does Xcode 4 auto-generate a instance variable?

我来自C开发,刚开始学习Objective-C和Xcode4。据我所知,如果不需要检查/控制正在读取或写入的值,则"@synthesis"正在替换属性的getter/setter方法。

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

这还不够吗:

1
@synthesize myProperty;

而不是:

1
@synthesize myProperty = _myProperty;

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

事先谢谢!

孟菲兹

编辑:

我知道@synthesive正在取代getter/setter,但这部分有什么好处:= _myProperty;?如果我可以直接使用"myproperty",为什么要有一个实例变量?如果setter(例如)检查值的条件,我会理解使用"MyProperty"。如果我想跳过这项检查,我将使用MyProperty。但是,当我使用@synthesis时,我没有一个设置器来进行检查。那么,为什么我有/想要一个实例变量呢?

答:

看看Mattyg的帖子里的评论!


这是一个惯例,用来提醒程序员通过setter和getter自己访问实例变量。因此,如果您正在使用:

1
@synthesize myProperty = _myProperty;

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

1
_myProperty = something;

要通过setter访问变量,必须写入:

1
self.myProperty = something;

好处是如果你忘记通过自我进入。然后编译器将警告您:

1
myProperty = something;  //this won't compile

另请参阅此问题。


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

下面是用C声明属性的方法#

1
2
3
4
5
private int _int1;
public int int1 {
  get { return _int1; }
  set { _int1 = value; }
}

这是一段非常常见的代码,C允许您对其进行缩写,以避免反复键入相同的代码。

1
public int int1 { get; set; }

这两个代码段之间的区别在于后者中不存在私有变量"int1",因为c在内部创建了一个变量。@synthesis关键字很不错,因为它可以让您省去反复编写相同代码的麻烦,同时还允许您访问它所基于的实例变量。

编辑。同样重要的是要注意,getter和setter确实存在于目标C中。它们的名称与C中的不同,在C中它们被标记为get和set。在目标C中,getter是一个与实例变量同名的方法,setter是一个单词为"set"后接实例变量名、首字母大写的方法。

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

1
2
3
int myVar;
...
@property(nonatomic, assign) int myVar;

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

1
2
3
4
5
6
7
-(int)myVar {
  return myVar;
}

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

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