首先,请原谅这个问题的愚蠢,但我不是来自C / C ++背景。我有点不清楚.h和.m文件在属性方面的角色差异。
我理解接口的概念,我看到.h文件部分是实现的接口,但我不清楚的是:
当我写这样的东西时,我在括号中定义了什么:
IBOutlet UITextField * numberField;
这是接口中的字段定义吗?
当我将.Property行添加到.h文件时,是n个auto属性的实际实现还是只是一个接口蓝图?如果@syntesis是实际的实现呢?
我想我最大的困惑似乎是,如果我想要一个属性,我在接口支撑中的三个不同位置(1)定义我需要的东西,(2)在大括号外面的@property和(3) .m文件中的@synthesis。这似乎很长,但如果我能弄清楚这三个部分的作用,那就好了。
干杯,克里斯。
答案 0 :(得分:79)
答案 1 :(得分:1)
方法是在大括号之外定义的,因为大括号意在封装对象的状态,可以论证的不包括实例或类方法。
您在大括号中定义的是可以作为self.ivar引用的实例变量
@property和@synthesize指令只是为您的实例变量设置访问器,因此您可以通过执行self.ivar = someVar来设置它们。换句话说,它设置了“点语法”供您使用。
并回答你的结局问题:要定义属性或实例变量,只需在.h文件中将其声明为大括号内的变量。要在同一属性上设置访问器方法,您需要同时执行@property和@synthesize。
答案 2 :(得分:0)
那就是客观C语法,方法和{}以外的@property以及{}中的变量。
@property是告诉你要编写getter和setter(强制执行)的方式,但你可以编写getter / setter而不设置它们@property。 @property在.h文件中是因为它的声明。为什么它在{}以外,正如我之前所说的那样,我们可以做什么?
@synthesis将在实际实现getter和setter,如果你没有合成但是你已经设置了@property,你必须用手实现那些getter和setter。并且@synthesis在.m文件中,因为它的实现。
有关此主题的更多信息,请点击此处。
答案 3 :(得分:0)
括号内的变量定义了类的物理结构。这些是存储信息的实际实例变量。
括号外的东西构成了类的接口 - 方法和属性。一个属性本身并不保留任何存储空间或影响任何变量 - 它只是声明一个用于访问某些东西的通用接口。请记住,属性不必具有基础实例变量 - 例如,ShoppingCart类中的totalPrice属性可以动态地对购物车中所有项目的价格求和。
在实现文件中,您告诉类如何实际执行其工作。显然,对于方法,您只需提供一个实现。对于属性,您可以自己提供访问器实现,也可以要求它为实例变量合成访问器。