입력에 대한 설정을 정렬하고 싶었던 클래스의 설정자가 있습니다 (비용이 거의 들지 않습니다). 그리고 좀 더 빠르게 만들기 위해 정적 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...
}
}
불변 개체가 스레드 안전하다는 것을 알고 있지만 아래 응답에서 언급 한 것처럼 뭔가 불변하다고 생각하는 것이 좋지 않습니다. 불변. 이 경우에는 문서에 버그를 제기하여 앞으로 더 명확해질 것입니다. –
감사합니다. 명확하게 분명히해야합니다! – bbum
파일 레이더, 버그 ID 9131037. –