【问题标题】:Dot notation - property / method点表示法 - 属性/方法
【发布时间】:2013-01-30 03:58:50
【问题描述】:

健全性检查。鉴于此:

@property (readwrite, nonatomic) NSDate *start;

那么这两行代码不是一样的吗?

版本 1:

self.start.description

版本 2:

[self.start description]

即start.description 在start 对象上调用description 方法。

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    是的,它们是相同的,[[self start] description] 也是如此

    【讨论】:

      【解决方案2】:

      基本上是的。

      在属性周围有一个 setter 和 getter 自动同步。如果您使用 @syncronize 语句,那么您就有机会影响 setter、getter 和属性的命名方式。如果您自动同步属性的名称是_start。 getter 名称是 start,setter 名称是 setStart。

      所以

      something = self.start
      

      实际上调用了getter和

      self.start = something
      

      调用setter。 等价物是:

      something = [self start];
      [self setStart:something];
      

      如果您想直接访问实例变量,请执行以下操作:

      _start = something;
      something = _start;
      

      如果您只使用@synthesize start;,则等效为:

      start = something;
      something = start;
      

      这可能会令人困惑,但start 实际上是在处理实例变量,而self.start 使用的是setter/getter。当您不使用 ARC 时,这种差异变得非常重要。根据属性参数(例如分配、复制、保留……),自动生成的 getter 和 setter 会为您执行一些内存管理,而当您直接使用实例变量时,内存管理留给您。

      【讨论】:

        【解决方案3】:

        是的。两种情况下的结果都是相同的;属性(大部分)只是用传统 Cocoa 样式编写的访问器方法的糖。

        我说“大部分”是因为存在一些细微的内部差异。属性作为元数据添加到 Objective C 类的运行时描述中。您可以通过一些反思找出已声明为此类的属性列表。此列表不同于以 getter/setter 样式命名的方法列表。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-21
          • 1970-01-01
          • 2010-11-17
          • 2021-05-25
          • 2012-07-08
          • 2014-12-09
          • 1970-01-01
          相关资源
          最近更新 更多