2017-11-26 19 views
0

내가 원자 인 NSOperationQueue을 만들어야합니다.NSOperationQueue에 대한 세터 만들기

@property (atomic, strong) NSOperationQueue *queue; 

나는이 게터 있습니다

- (NSOperationQueue *)queue { 
    if (_queue == nil) { 
    _queue = [NSOperationQueue mainQueue]; 
    [_queue setMaxConcurrentOperationCount:1]; 
    } 
    return _queue; 
} 

을하지만, 엑스 코드는 내가 세터를 생성해야했다.

이 경우의 세터는 어떻게해야합니까? 나는 모른다.

+0

나는 getter에서 해당 'maxConcurrentCount'를 제거합니다. 메인 큐는 이미 직렬 큐이며'setMaxConcurrentCount'를 호출하면 메인 큐에 대한 오해가 있음을 알 수 있습니다. 만약 당신이 자신의 큐를 생성했다면, 반드시 'maxConcurrentCount'를 설정하십시오. 그러나 메인 큐를 사용할지는 아닙니다. – Rob

답변

2

두 관찰 : 당신이 당신의 자신의 세터를 정의한다면

  1. , 그것과 같을 수 있습니다 당신은 (세터와 게터 모두) 모두 접근 방법을 구현하는 경우,

    - (void)setQueue:(NSOperationQueue *)queue { 
        _queue = queue; 
    } 
    

    가 기억 , ivar를 수동으로 합성해야합니다. 당신의 @implementation에서

    @synthesize queue = _queue; 
    

    , 컴파일러가 더 이상 안전 전혀 특정 이름의 바르가 필요 없다고 가정 할 수 있기 때문이다.

  2. atomic 또는 nonatomic이어야하는지 다시 확인해야합니다. 당신의 getter가 atomic이 아니기 때문에 (제 예제 설정자도 아닙니다), 아마도 이것을 nonatomic로 만들고 싶을 것입니다. 값이 atomic "이면 합성 된 접근자는 값이 항상 getter 메서드로 완전히 검색되는지 또는 다른 스레드에서 접근자가 동시에 호출 되더라도 setter 메서드를 통해 완전히 설정된다는 것을 의미합니다."(Programming with Objective-C: Properties are atomic by default) 원자 접근 방법이 필요하지 않은 경우가 많지만, 그렇게했다면 해당 구현을 변경하여 적절하게 동기화 할 수 있습니다 (예 : NSLock, @synchronized 지시어, 직렬 대기열, 리더기 패턴 등).

    참고 : nonatomic으로 만들면 사용자 정의 게터를 수반 할 사용자 정의 작성기를 작성할 필요가 없습니다. atomic 속성에 대해 자신의 getter를 구현 한 경우 컴파일러는 해당하는 setter와 getter를 동기화하는 방법을 알 수 없으므로 해당하는 atomic 설정자를 합성 할 수 없습니다. 그러나 동기화가 필요하지 않은 속성 nonatomic을 컴파일러가 만들면 컴파일러가 간단하고 동기화되지 않은 setter를 합성 할 수 있으며 setter를 구현하라는 경고 메시지도 사라집니다.

1

먼저 "queue"속성을 읽기/쓰기 속성으로 선언했습니다. 그건 말이되지 않습니다. 정말로 모든 사람이 "대기열"에 지정되기를 원하지는 않습니다.

두 번째로 속성을 "원자"로 선언했습니다. 당신이 "원자"가 무엇을하는지 읽었거나, 그것이 유용하다는 것은 매우 드뭅니다. 손으로 직접 작성하는 getter 또는 setter는 항상 비 원자력입니다. 그래서 당신은 원자가 아닌 getter를 가지며 속성 자체는 원자 읽기/쓰기 속성이기 때문에 원자 적으로 자동 생성 된 setter가 있습니다. 비 원자 getter와 원자 setter를 결합 할 수 없으며 그 반대의 경우도 가능합니다.

해결 방법 : 속성을 비 원자적이고 읽기 전용으로 변경하십시오. 한 가지 부작용은 _queue 백업 변수를 잃는 것입니다 (필요한 모든 접근자가 구현되면 백업 변수를 얻지 못하기 때문에 _queue를 직접 선언해야합니다).

+0

"손으로 직접 작성한 getter 또는 setter는 항상 비 원자"입니다. 음 ... 모든 원자 코드가 자동으로 (또는 발?) 작성된 것을 알지 못했습니다. ;-) – CRD