给定具有原子属性的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

最佳答案

在此实现中,类B的value属性是否也会原子化?

从某种意义上说,您可能是说。

原子性是属性综合设置和获取器的功能,它会影响对属性(通常是自动分配)的后备变量的访问。

只有A中的属性才被合成并具有支持变量,因此是“原子的”。您在B中的属性由您使用两种方法实现,并且没有后备变量。当您的B中的setter和getter调用A中的setter和getter时,后者的行为与往常一样,这是原子的。

那就是A中的属性是唯一确定访问其后备变量是否为原子的条件,前提是此类访问始终通过其setter和getter进行。如果绕过setter和getter并直接访问后备变量,则绕过那些访问器提供的任何原子性。

高温超导

关于ios - 如何正确地从内部类转发原子属性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46377556/

10-11 22:32
查看更多