以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——在这种情况下,您提供了访问器,因此您可以自由地派生属性的值,无论您喜欢。