如何从内部 class 正确转发原子 属性?

How to correctly forward atomic property from inner class?

给定 class A 具有来自 header 标准框架之一的原子属性,看起来像这样:

@interface A : NSObject

@property float value;

@end

Class B 扩展、覆盖并在某些情况下转发 class A 的组合逻辑。 class B 中的值 属性 也会与此实现原子化吗?

@interface B : NSObject

@property float value;

@end

@implementation {
    A _innerA;
}

- (instancetype)init {
    self = [super init];
    if (self) {
        _innerA = [A new];
    }
    return self
}

- (float)value {
    return _innerA.value;
}

- (void)setValue:(float)value
{
    _innerA.value = value;
}

@end

还是应该有额外的锁机制?

@implementation {
    A _innerA;
    dispatch_semaphore_t _valueSemaphore;
}

- (instancetype)init {
    self = [super init];
    if (self) {
         _innerA = [A new];
         _valueSemaphore = dispatch_semaphore_create(1);
    }
    return self
}

- (float)value {
    dispatch_semaphore_wait(_valueSemaphore, DISPATCH_TIME_FOREVER);
    float value = _innerA.value;
    dispatch_semaphore_signal(_valueSemaphore);
    return value;
}

- (void)setValue:(float)value
{
    dispatch_semaphore_wait(_valueSemaphore, DISPATCH_TIME_FOREVER);
    _innerA.value = value;
    dispatch_semaphore_signal(_valueSemaphore);
}

如果内部 class 本身将被定义为原子 属性 怎么办?

@interface B ()

@property A innerA;

@end

@implementation

- (instancetype)init {
    self = [super init];
    if (self) {
        _innerA = [A new];
    }
    return self
}

- (float)value {
    return self.innerA.value;
}

- (void)setValue:(float)value
{
    self.innerA.value = value;
}

@end

Will value property in class B also atomic with this implementations?

从某种意义上说,是的。

原子性是 属性 的合成 setter 和 getter 的一个特征,影响对 属性 的(通常是自动分配的)支持变量的访问。

只有 A 中的 属性 被合成并具有支持变量,因此是 "atomic"。 B 中的 属性 是你用两种方法实现的,没有支持变量。当 B 中的 setter & getter 调用 A 中的 setter & getter 时,后者的行为与往常一样,即原子性.

也就是说 A 中的 属性 是对其支持变量的访问是否是原子的唯一决定因素,前提是此类访问始终通过其 setter 和 getter.如果您绕过 setter & getter 并直接访问支持变量,那么您将绕过这些访问器提供的任何原子性。

HTH