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