2011-03-13 6 views
1

입력에 대한 설정을 정렬하고 싶었던 클래스의 설정자가 있습니다 (비용이 거의 들지 않습니다). 그리고 좀 더 빠르게 만들기 위해 정적 NSSortDescriptor를 만들 것입니다. 정렬 매개 변수가 항상 같기 때문입니다.NSSortDescriptor는 안전합니까?

setter는 원자 적이기 때문에 의미가 있습니다. NSSortDescriptor의 동일한 인스턴스를 @synchronized 블록 외부의 여러 스레드에서 사용하는 것이 안전한지 궁금합니다. (입력 할 배열을 정렬하기 때문에 @ 동기화 된 블록). 다음 코드는 안전합니까? 또는 너무 성급한 최적화입니까?

- (void) setMyArray:(NSArray*)newMyArray 
{ 
    static NSArray *sorter = nil; 

    @synchronized(self) 
    { 
     if (sorter == nil) 
     { 
     NSSortDescriptor *sortObj = [NSSortDescriptor sortDescriptorWithKey:@"size" ascending:YES]; 
     sorter = [[NSArray arrayWithObject:sortObj] retain]; 
     } 
    } 

    NSArray *sorted = [myNewArray sortedArrayUsingDescriptors:sorter]; 

    @synchronized(self) 
    { 
     // set iVar from sorted array... 
    } 
} 

답변

0

documentation specifically 상태 :

불변의 객체는 일반적으로 스레드 안전; 은 안전하게 개체에 전달할 수 있으며 은 스레드에서 전달할 수 있습니다. 물론 불변 객체 인 을 사용할 때는 참조 카운트를 올바르게 사용해야합니다. 을 사용해야합니다. 부적절한 경우 보유하지 않은 객체를 해제하면 나중에 예외가 발생할 수 있습니다. 구체적으로는 (클래스 문서에서 일반적으로) 달리 언급하지 않는

hoha 관찰로서 NSSortDescriptor는 불변이며, 이후

그것은 안전 쓰레드이다.

+0

불변 개체가 스레드 안전하다는 것을 알고 있지만 아래 응답에서 언급 한 것처럼 뭔가 불변하다고 생각하는 것이 좋지 않습니다. 불변. 이 경우에는 문서에 버그를 제기하여 앞으로 더 명확해질 것입니다. –

+0

감사합니다. 명확하게 분명히해야합니다! – bbum

+0

파일 레이더, 버그 ID 9131037. –

0

NSSortDescriptor 그것을 변경 보이는 방법을 가지고 있지 않으며, 대부분의 아마 스레드 안전 (그래서 내부적으로 상태를 변경하는 어떤 이유가없는 애플은 프레임 워크 코드에에 해킹을하지 않는 한 나는 의심한다).

최적화의 경우 실제 프로파일 링 없이는 거의시기 상조입니다. 이 경우에는 static var을 사용하여 동일한 작업을 수행하겠습니다. 대부분 내 정렬 전략이 명확하게 선언/정의 된 장소를 갖기 위해서입니다.

+0

일반적으로 사물에 스레드 세이프가 있다고 가정 할 경우 그 영향에 대한 문서가 없을 때 좋지 않은 생각입니다. 내부적으로 캐시를 조작하는지 또는 다른 형태의 수정을하는지 여부를 알 수있는 방법이 없습니다. –

+1

아무 것도 스레드로부터 안전하지 않다고 가정하지 마십시오. 무언가가 스레드로부터 안전하다면 ** ** 명시 적으로 문서화됩니다. 이런 종류의 가정을하면 충돌로 이어질 것입니다. (그리고 종종 소프트웨어 업데이트 후에 충돌로 이어질 것입니다.) – bbum

+0

@ 케빈 발라드 : 그렇습니다. 정렬 설명자에 가변적 인 상태를 상상할 수는 없지만 그 존재 여부를 증명할 수는 없습니다. 그래서 제가 "아마도"라고 말한 것입니다. BTW "Threading Programming Guide"는 "불변 개체는 일반적으로 스레드로부터 안전합니다"라고 말하면서 나를위한 간접적 인 증거가되었습니다. – hoha