目标C语言 苹果如何管理@private var和@properties



UIButton接口为例。

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

  @private
    CFMutableDictionaryRef _contentLookup;
    UIEdgeInsets           _contentEdgeInsets;
    UIEdgeInsets           _titleEdgeInsets;

这里有两个变量,它们被定义为属性:

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

然而,这两个属性在private method(后缀_)中的ivars上没有定义。

我不太明白如何实现这两个属性的setter和getter来引用私有变量。

第二个问题…我曾经为ivar创建属性,因此,如果我有一个ivar FOO,我可以为FOO创建一个@property。为不存在的变量创建属性是正常的行为吗?(在这种情况下,contentEdgeInsets不是这个类的属性…相反,_contentEdgeInset@interface中定义,这是一个有效的变量)。好的,这个论证我遗漏了什么?

当你@synthesize这些属性的时候,你可以这样做

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

查看文档中的属性实现指令部分

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

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

最后,使用@dynamic而不是@ synthetic访问器的属性根本不需要ivar——在这种情况下,您提供了访问器,因此您可以自由地派生属性的值,无论您喜欢。

最新更新