2017-09-23 9 views
1

지정된 클래스 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

이 구현 예 원자 클래스 B 또한 재산 가치 것인가?

의미에서 그렇습니다.

원자 성은 합성 된 setter의 기능입니다. 속성의 getter와 속성의 (일반적으로 자동으로 할당 된) backing 변수에 대한 액세스가 영향을줍니다.

A에있는 귀하의 자산 만 합성되며 백업 변수가 있으며 "원자"입니다. B의 속성은 두 가지 방법으로 구현되며 백업 변수가 없습니다. 설정자 & 게터가 B 일 때 setter & 게터가 A에있을 때 후자는 항상 그렇듯이 즉 원자 적으로 동작합니다.

A의 속성은 해당 액세스가 항상 해당 설정자 & 게터를 통해 이루어지는 경우 해당 백업 변수에 대한 액세스가 원자인지 여부를 결정하는 유일한 결정자입니다. setter & getter를 건너 뛰고 직접 변수에 액세스하면 해당 액세서에서 제공되는 원 자성을 무시합니다.

HTH