给定具有原子属性的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
答案 0 :(得分:1)
对于这种实现,B类中的value属性是否也是原子的?
从某种意义上说,你可能意味着,是的。
原子性是合成的setter& amp;的特征。属性的getter和对属性(通常是自动分配的)后备变量的访问。
只有A
中的属性被合成并具有支持变量,因此是" atomic"。 B
中的属性由两个方法实现,没有后备变量。当你的二传手与B
中的getter调用setter& A
中的getter然后后者表现得像往常一样,这是原子的。
这就是A
中的属性是唯一的决定因素,即对其后备变量的访问是否是原子的,只要这些访问总是通过其setter& amp;吸气。如果你绕过了setter& getter并直接访问支持变量,然后绕过这些访问器提供的任何原子性。
HTH