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

时间:2017-09-23 08:19:54

标签: ios objective-c multithreading atomic

给定具有原子属性的A类,其标准框架之一具有如下所示的标题:

@interface A : NSObject

@property float value;

@end

B类扩展,覆盖并在某些情况下转发具有组合的A类逻辑。在这个实现中,B类中的value属性是否也是原子的?

@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);
}

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

@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

1 个答案:

答案 0 :(得分:1)

  

对于这种实现,B类中的value属性是否也是原子的?

从某种意义上说,你可能意味着,是的。

原子性是合成的setter& amp;的特征。属性的getter和对属性(通常是自动分配的)后备变量的访问。

只有A中的属性被合成并具有支持变量,因此是" atomic"。 B中的属性由两个方法实现,没有后备变量。当你的二传手与B中的getter调用setter& A中的getter然后后者表现得像往常一样,这是原子的。

这就是A中的属性是唯一的决定因素,即对其后备变量的访问是否是原子的,只要这些访问总是通过其setter& amp;吸气。如果你绕过了setter& getter并直接访问支持变量,然后绕过这些访问器提供的任何原子性。

HTH