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,但这部分有什么好处:
答:
看看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