2008-10-22 3 views
4

Objective-C NSMethodSignature/@encode 기능을 사용하여 일부 언어 간 데이터 형식 변환을 수행하고 있습니다. 즉, @encode() 형식으로 설명 된 구조에 값을 프로그래밍 방식으로 복사 할 수 있어야합니다. 예를 들어, 나는 4 개의 float을 가질 수 있고 CGRect에 그것들을 삽입 할 필요가있다. CGRect는 2 개의 구조체를 포함하는 구조체이다. 각각은 2 개의 float을 포함한다. @encode 용어로, 유형이 있습니다 :iPhone OS에서 구조체 정렬에 대한 정확한 규칙은 무엇입니까?

{CGRect={CGPoint=ff}{CGSize=ff}} 

나는 원시적 인 구조 구성원의 데이터 유형을 알고 구조 레이아웃을 추측 할 수 있어야이 이렇게하려면 -이 경우 4 수레에 있습니다.

역사적으로 ARM 구조체 정렬에는 두 가지 다른 규칙이 있습니다. 하나는 구조체의 모든 멤버를 가장 큰 멤버를 만족시키는 경계 크기에 정렬하는 것이 었습니다. 다른 하나는 각 멤버의 데이터 유형에 적합한 경계 크기의 모든 멤버를 정렬하는 것이 었습니다.

ARM 및 x86/x86_64에서 OS X/iPhone OS에 사용되는 것은 어느 것입니까?

+0

나는 당신이하려고했던 것을 잘못 이해했으며, 그것을 더 자세히 검토 할 때 나는 여전히 좋은 이해력을 가지고 있지 않습니다. 이 정보를 어떻게 사용하는지 자세히 설명해 주시겠습니까? 다른 언어로 구조를 동적으로 생성하려고합니까? 데이터를 다른 곳으로 이동하려고합니까? –

답변

1

단순히 CGRect를 인코딩하려면 NSCoder -encodeCGRect : forKey :에 대해 UIGeometryKeyedCoding 범주 추가를 사용해야합니다.

시스템 간을 이동하려는 경우 NSRectFromCGRect()를 사용하여 CGRect를 NSRect로 변환 한 다음 -encodeValueOfObjCType : at :을 사용하여 NSRect를 인코딩하는 것이 좋습니다.

다른 C 구조체를 인코딩하려는 경우 Apple은 'C 데이터 형식 인코딩 및 디코딩'설명서에 설명 된 매우 명확한 정책을 가지고 있습니다. 'Structures and Bit Fields'에 명시되어 있듯이 "구조 또는 비트 필드 컬렉션을 보관하는 가장 좋은 방법은 필드를 독립적으로 보관하고 각각에 적절한 인코딩/디코딩 방법을 선택하는 것입니다."

+0

재미 있고 대답 해 주셔서 감사합니다. 하지만 @encode() 문자열에서 파생 된 정보 만 사용하여 모든 구조체 유형에 대한 일반적인 대답을 찾아야합니다. 예를 들어 NSRect와 CGRect 간의 동등성에 대한 지식이 없거나 구조체 유형별 사용자 정의 코드가 없습니다. –

관련 문제