【问题标题】:Further clarification of _property after readonly attribute?在 readonly 属性之后进一步澄清 _property?
【发布时间】:2014-01-07 21:05:51
【问题描述】:

在接口部分设置只读属性时,这会“禁用”该属性的 setter 方法。我需要澄清一下:

  1. 如果我们可以使用 _propertyName 设置只读属性,那么它的意义何在?
  2. 如果我们的属性是可读写的,何时使用 _propertyName?

  3. 另外,我知道我们使用 setter 方法来实现一定程度的抽象,而不是仅仅使用 _propertyName 分配值。还有其他不使用 _propertyName 的理由吗?

下面是一些示例代码。谢谢。

接口部分

@property (nonatomic, readonly) NSString *licensePlate;
@property (nonatomic, readonly) NSString *bodyColor;

实施部分

-(id) initWithCarFeatures {
    self = [super init]
    if (self) {
        _licensePlate = @"XSHJDS8687";
        _bodyColor = @"blueColor";
    }
    return self;
}

【问题讨论】:

    标签: objective-c properties readonly ivars


    【解决方案1】:
    1. 重点是“封装”。没有其他文件可以直接设置该属性。该属性只能从给定文件中设置,例如,使用init,或使用专门的方法。

    2. 大多数人会告诉您,您应该只在 init 方法、dealloc(如果您不使用 ARC)中直接使用 _property,当然,如果您正在实现自己的 setter 和 getter .即使属性被声明为readonly,通常你在类扩展中声明它readwrite。因此,对于其他文件,它将保持readonly,但对于声明它的实现文件(类),它将是readwrite

    3. 许多原因,例如“继承” - 设置器可以被覆盖。对于copy 属性,复制由setter 处理。对于 MRC(不是 ARC),setter 更加重要(它们处理保留和释放)。

    【讨论】:

    • Sulthan,只有一件事,当您提到“只能从给定文件中设置”时,这是否意味着您只能在声明只读的类的实现文件中执行 _propertyName? ty
    • @CescSergey 不,这是一个更复杂的问题。 _propertyName 是一个“ivar”(实例变量)。您实际上可以在@interface 中将其声明为完全公开。但是,通常当您使用ivar 备份属性时,您会将其设为私有(合成使其私有)。这意味着只有类可以访问它。属性声明不会以任何方式限制对 ivar 的访问。
    • 除了获取或设置底层变量之外,getter 和/或 setter 的默认实现是否做其他事情?换句话说,这些方法中是否会自动生成代码来进行任何类型的内存管理?例如,如果我创建自己的 setter,是否需要在其中包含任何内存管理代码?
    • @David 当然。里面的魔法相当复杂。我建议你提出一个单独的问题。例如,如果属性声明为atomic,就会有一些同步机制。我不确定在这种情况下我的内存管理是什么意思,但是 MRC 和 ARC 的方法非常不同。
    • 我的意思是,如果我实现自己的 getter/setter,那么我是否有责任确保我的实现解决了所有属性属性。因此,如果我将一个属性声明为原子的,那么我需要确保我明确地实现原子行为 --- 编译器不会在我的 getter/setter 周围插入代码来支持这些属性。
    猜你喜欢
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多