2011-04-13 21 views
0

我拿例如UIButton接口。Apple如何管理@private var和@properties?

这里@private定义的第一行:

@private 
    CFMutableDictionaryRef _contentLookup; 
    UIEdgeInsets   _contentEdgeInsets; 
    UIEdgeInsets   _titleEdgeInsets; 

在这里这些实例变量的2,被定义为属性:

@property(nonatomic) UIEdgeInsets contentEdgeInsets; 
@property(nonatomic) UIEdgeInsetstitleEdgeInsets; 

然而,这些2种性质不会对高德I所定义在私人方法中找到(后缀为_)。

我不知道如何实现setter和getter这两个属性来引用私有ivars。

第二个问题......我用来为伊娃创建属性,因此,如果我有一个ivar FOO我可以为FOO创建一个@property。这是一个正常的行为,为一个不存在的伊娃制造财产吗? (在这种情况下,contentEdgeInsets不是此类的属性......相反_contentEdgeInset@interface中定义,这是一个有效的伊娃)。好吧,我错过了这个论点?

回答

1

当你@synthesize这些属性你这么喜欢

@synthesize contentEdgeInsets = _contentEdgeInsets; 
      ^property name  ^iVar name 

退房文档中的Property Implementation Directives部分。

+0

Omg ...我是一个白痴:P我从来没有使用过这些选项,并忘记考虑这一点...但为什么把它定义为私人..而不是允许公共访问。这听起来很奇怪。 – MatterGoal 2011-04-13 13:10:42

+1

不,你不是个白痴:)。公共访问是通过一个属性并为该类提供封装。他们有朝一日例如摆脱伊娃的制作contentEdgeInsets @dynamic因为你是通过属性访问它,它绝不会影响你的代码。 – Joe 2011-04-13 13:12:33

+0

好的,然后是一种类似于C++的方法,为私有属性定义访问器方法。 – MatterGoal 2011-04-13 13:18:14

1

默认情况下,酒店将使用其名称伊娃是相同的属性,但它也可以指定一个不同名称的伊娃。在类实现的@synthesize语句中执行此操作。

在现代运行时中,在这一点上几乎在任何地方都使用,实际上根本不需要声明ivar - 如果综合属性的访问器并且没有匹配的ivar,运行时将提供一个。

最后,使用@dynamic而不是@synthesized访问器的属性并不一定需要ivar--在这种情况下,您提供了访问器,所以您可以自由地导出属性的值,但是您喜欢。