【问题标题】:How Apple manage @private var and @properties?Apple 如何管理@private var 和@properties?
【发布时间】:2011-04-13 12:52:06
【问题描述】:

我以UIButton 接口为例。

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

  @private
    CFMutableDictionaryRef _contentLookup;
    UIEdgeInsets           _contentEdgeInsets;
    UIEdgeInsets           _titleEdgeInsets;

这里有 2 个被定义为属性的 ivar:

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

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

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

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

【问题讨论】:

    标签: objective-c


    【解决方案1】:

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

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

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

    【讨论】:

    • 天啊...我是个白痴:P 我从来没有使用过这些选项并且忘记了考虑...但是为什么将其定义为私有...而不是允许公共访问。听起来很奇怪。
    • 不,你不是白痴:)。公共访问是通过属性并为类提供封装。例如,他们有一天可以摆脱 iVar make contentEdgeInsets @dynamic 并且它永远不会影响您的代码,因为您是通过属性访问它。
    • 好吧,那是一种类似C++的方法,为私有属性定义访问器方法。
    • 是的,您不是直接访问私有变量而是调用方法。 view.contentEdgeInsets == [view contentEdgetInsets] 属性只是语法糖。除了定义支持属性的 iVar 之外,您还可以定义 getter 和 setter 方法。
    【解决方案2】:

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

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

    最后,带有 @dynamic 而不是 @synthesized 访问器的属性根本不需要 ivar —— 在这种情况下,您提供了访问器,因此您可以随意派生属性的值.

    【讨论】:

      猜你喜欢
      • 2021-07-24
      • 1970-01-01
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 2011-09-17
      • 2019-01-09
      • 2019-04-15
      相关资源
      最近更新 更多