1

我注意到一些代码示例使用以下语法:

@synthesize myProp = _myProp;

这与仅仅这样做有什么不同?

@synthesize myProp;

后来在代码中,他们通过这样做来调用它:

self.myProp = xyz;

为什么不这样称呼它呢?

mpProp = xyz;

有人可以解释这些差异吗?

4

2 回答 2

3

你的问题有两个部分。

第1部分:

Usingself.myProp = xyz调用属性的 setter 来设置数据,而不是直接赋值myProp = xyz。建议通过 setter 和 getter 访问和修改数据,甚至是私有或内部数据。正如@SplinterReality 在他的回答中提到的那样,它们为您提供了一种处理与数据相关的问题的方法。但相关问题可能不止于此,例如:

延迟加载

- (SomeObject *) myProp {
    if(_myprop == nil) {
        _myProp = [[SomeObject alloc] init];
    }
    return _myProp;
}

做一些相关的动作注意:这也可以由 KVO 来处理。这更简单。

- (void) setProperty:(SomeObject *)object (
    _property = object;
    id relatedProperty = //Contruct related value here.
    self.relatedProperty = relatedProperty;
    [self updateViewThatShowsPropertyContent];
}

第2部分:

Using@synthesize用于创建属性的默认设置器和获取器,即您不会为它们提供自定义实现。

@synthesize myProp = variableName;将生成的实例变量命名为_variableName. 但默认行为是生成一个名为_propertyfor的实例变量@property property。所以@synthesize myProp = _myProp;@synthesize myProp;没有什么不同。

但是,在现在使用的现代 Objective-C 中,@synthezie不需要它,即它是为你调用的。因此,除非您需要提供除默认名称之外的实例变量,否则您不需要调用它。

于 2013-06-14T03:57:11.207 回答
3

这样做的主要优点是您在访问属性时使用了 getter 和 setter。这很重要,因为:

  • Setter 自动管理内存语义,自动保留和释放对象引用。
  • 自动获取 KVO 语义,这在几种不同的上下文中很重要

第一个原因对 ARC 来说不太重要,但后者仍然是一个很大的好处。

于 2013-06-14T00:31:36.190 回答