Apple如何管理@private var和@properties?

时间:2011-04-13 12:52:07

标签: objective-c

我以UIButton界面为例。

这里是@private定义的第一行:

  @private
    CFMutableDictionaryRef _contentLookup;
    UIEdgeInsets           _contentEdgeInsets;
    UIEdgeInsets           _titleEdgeInsets;

这些ivar中有2个被定义为属性:

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

然而,我在私有方法(后缀为_)中找到的ivars上未定义这两个属性。

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

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

2 个答案:

答案 0 :(得分:1)

当@synthesize这些属性时,你会这样做

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

查看文档中的Property Implementation Directives部分。

答案 1 :(得分:1)

默认情况下,属性将使用名称与属性名称相同的ivar,但也可以指定其他名称的ivar。在类实现中的@synthesize语句中执行此操作。

在现代运行时,此时几乎无处不在,实际上你根本不需要声明ivar - 如果你为一个属性合成访问器并且没有匹配的ivar,那么运行时将提供一个。 / p>

最后,使用@dynamic而不是@synthesized访问器的属性根本不需要ivar - 在这种情况下你提供了访问器,所以你可以自由地派生属性的值,但是你喜欢