2013-02-08 3 views
2

본 연구에서는 CoreFoundation 오브젝트의 내부 구조를 이해하고자합니다. 는 아래 전역 스레드 안전 고유 값이 생성되어 nextID 부재 CGColor에 할당 된 각 개체에 대한 증가 된 보유하다 free quartz project.CGColorRef 오브젝트의 ID가 불투명입니다.

typedef struct CGColor { 
     CFRuntimeBase obj; 

     CFTypeID nextID; 
     CGColorSpaceRef colorSpace; 
     CGPatternRef pattern; 
     size_t numberOfComponents; 
     CGFloat *components; 
} *CGColorRef; 

에서 CGColor의 구조를 부여. 문서화되지 않은 CGColorGetIdentifier() 함수 만이 값을 반환합니다.

CoreGraphics 및 해당 리소스 라이브러리를 확인했습니다. 나는 ripc_GetColor (libRIP.A.dylib) 함수 만이 CGColorGetIdentifier() 함수를 호출하고 일부 색상 쌍의 nextID 값을 비교하는 것으로 보인다. CGColorGetIdentifier에 대한

콜 스택 (nextID에 대해 추론을하는 데 도움의 희망은)

0 com.apple.CoreGraphics CGColorGetIdentifier + 0 
1 libRIP.A.dylib   ripc_GetColor + 112 
2 libRIP.A.dylib   ripc_DrawGlyphs + 1740 
3 com.apple.CoreGraphics CGContextDelegateDrawGlyphs + 108 
4 com.apple.CoreGraphics drawGlyphs + 284 
5 com.apple.CoreGraphics CGContextShowGlyphsWithAdvances + 208 

CFEqual 먼저 참조를 비교하고 비교 내용 때문에 비교 참조는 다음과 동일하지 않은 경우 올바른 접근법입니다. 참조가 변경되지 않으면 고유 ID 값을 만들고 유지하는 것은 낭비 일 것입니다.

따라서 고유 ID의 가능한 요구 사항과 개체의 동일성을 비교하는 것이 가능합니다.

  1. 스레드 안전성 문제가있을 때 참조를 비교하는 것이 ID를 비교하는 것이 좋습니다. 포인트를 참조하는 내용 (데이터)은 참조를 얻은 직후에 (다른 스레드가) 사용자 뒤에서 변경할 수 있습니다.
  2. 또는 나중에 사용하기 위해 저장된 참조는 동일한 스레드에서도 다른 예상치 못한 동작에 의해 릴리스 및/또는 수정됩니다.

그래서 우리는 콘텐츠에 대한 참조와 같은 것을 사용할 수 있으며 항상 사용할 수 있는지 확인합니다 (메모리가 해제되면 참조가 무효화 될 수 있음). 또한 전체 콘텐츠 대신 ID를 사용하는 것과 같은 약간의 데이터가있을 때 성능이 최적화됩니다.

Apple Core Graphics의 CGColor에서이 nextID의 실제 의도는 무엇입니까 /있을 수 있습니까? 이전의 접근법에서 남겨져 완전히 버려 질 수 없었습니까?

+2

freequartz에서이 구조체의 'nextID'필드 또는 Core Foundation 또는 Apple의 Core Graphics에 대해 알고 싶습니까? 그리고, 어느 쪽이든, 질문은 무엇입니까? –

+0

나는 그 질문을 바로 잡았다. Apple의 Core Graphics에 대해 묻습니다. CGColor 인스턴스의 메모리를 덤프하고 그 의도를 조사 할 때 ID 필드를 관찰했습니다. 나는 약간 회전을 찾는다. eng. 그것의 소스와 무료 석영 프로젝트도 그것을 사용하지만 그것은 조금 다른 구현되어있는 것으로 나타났습니다. __kCGColorSpaceID를 사용하므로 매번 CGColorSpaceGetTypeID가 새로운 증가 값을 반환해야하지만 그렇지 않습니다.나는 소스를 분해했지만 레브 할 시간이 없다. eng 모든 부품. 그래서 나는 누군가 그것을 이미 알고 있다고 생각하고 있습니다. 미리 감사드립니다. – lockedscope

답변

0

id nextID 필드는 내용의 요약처럼 조금 작용합니다. 객체의 동일한 내용 (이 경우 색상)을 식별합니다.

같음 객체는 모두 우리가 알고있는 것과 동일한 참조를 가져서는 안됩니다. 그것들이 등호 (Equal) 데이터를 포함하고 사실상 동일하다면. Black in RGB 또는 Black in BW .... 두 가지 모두 BLACK : D입니다. (예를 들면!) - 따라서 내용을 비교해야합니다.

숫자 또는 날짜 또는 그래서 당신은 그것을 찾을 수 있습니다 ... 그들은 태그가 지정된 번호 및 태그가 지정된 날짜라고합니다.

+0

그래서 참조가 이미 동일 할 때 식별자 값을 비교하는 이유는 무엇입니까? – lockedscope

+0

그럼 그들은 항상 ID와 포인터를 확인하지 않을 수 있습니다. (어느 쪽이든 안정된 int입니다.) –

+0

식별자와 참조가 같은지 확인하는 데 사용됩니다. 함수의 다음 호출을 위해; 그들은 Identifier와 ref를 사용하고있다. 그것이 동일한 대상인지, 여전히 유효한지를 결정합니다. 함수 내에서 조작을 수행하는 데는 새로운 참조 만 사용되기 때문에 참조의 동등성을 검사 할 필요는없는 것처럼 보입니다. 다른 인스턴스에 대한 참조가 만들어져 적절하지 않은 것을 알 수 있습니다. 또한 식별자는 인스턴스가 해제 될 때만 증가하므로 식별자가 오버 플로우하지 않는 한 참조의 동일성을 제공합니다. – lockedscope