如何从内部 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
给定 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