我以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)。好吧我错过了这个论点?
答案 0 :(得分:1)
当@synthesize这些属性时,你会这样做
@synthesize contentEdgeInsets = _contentEdgeInsets;
^property name ^iVar name
查看文档中的Property Implementation Directives部分。
答案 1 :(得分:1)
默认情况下,属性将使用名称与属性名称相同的ivar,但也可以指定其他名称的ivar。在类实现中的@synthesize语句中执行此操作。
在现代运行时,此时几乎无处不在,实际上你根本不需要声明ivar - 如果你为一个属性合成访问器并且没有匹配的ivar,那么运行时将提供一个。 / p>
最后,使用@dynamic而不是@synthesized访问器的属性根本不需要ivar - 在这种情况下你提供了访问器,所以你可以自由地派生属性的值,但是你喜欢