본 연구에서는 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의 가능한 요구 사항과 개체의 동일성을 비교하는 것이 가능합니다.
- 스레드 안전성 문제가있을 때 참조를 비교하는 것이 ID를 비교하는 것이 좋습니다. 포인트를 참조하는 내용 (데이터)은 참조를 얻은 직후에 (다른 스레드가) 사용자 뒤에서 변경할 수 있습니다.
- 또는 나중에 사용하기 위해 저장된 참조는 동일한 스레드에서도 다른 예상치 못한 동작에 의해 릴리스 및/또는 수정됩니다.
그래서 우리는 콘텐츠에 대한 참조와 같은 것을 사용할 수 있으며 항상 사용할 수 있는지 확인합니다 (메모리가 해제되면 참조가 무효화 될 수 있음). 또한 전체 콘텐츠 대신 ID를 사용하는 것과 같은 약간의 데이터가있을 때 성능이 최적화됩니다.
Apple Core Graphics의 CGColor에서이 nextID의 실제 의도는 무엇입니까 /있을 수 있습니까? 이전의 접근법에서 남겨져 완전히 버려 질 수 없었습니까?
freequartz에서이 구조체의 'nextID'필드 또는 Core Foundation 또는 Apple의 Core Graphics에 대해 알고 싶습니까? 그리고, 어느 쪽이든, 질문은 무엇입니까? –
나는 그 질문을 바로 잡았다. Apple의 Core Graphics에 대해 묻습니다. CGColor 인스턴스의 메모리를 덤프하고 그 의도를 조사 할 때 ID 필드를 관찰했습니다. 나는 약간 회전을 찾는다. eng. 그것의 소스와 무료 석영 프로젝트도 그것을 사용하지만 그것은 조금 다른 구현되어있는 것으로 나타났습니다. __kCGColorSpaceID를 사용하므로 매번 CGColorSpaceGetTypeID가 새로운 증가 값을 반환해야하지만 그렇지 않습니다.나는 소스를 분해했지만 레브 할 시간이 없다. eng 모든 부품. 그래서 나는 누군가 그것을 이미 알고 있다고 생각하고 있습니다. 미리 감사드립니다. – lockedscope