2012-06-14 5 views
0

메쉬에 벡터와 인덱스를 저장하기위한 정점 속성 배열을 만들려고합니다. 버텍스 애트리뷰트는 vector2, vector3 및/또는 vector4로 구성 될 수 있으므로 특정 유형의 객체를 반환하는 메서드를 제한하지 않고도 모든 것을 처리하는 클래스를 만들고 싶습니다.NSMutableData에 다른 데이터 유형을 할당하는 방법

VertexAttributeArray *vertexAttributeArray = [[VertexAttributeArray alloc] init]; 

[vertexAttributeArray data][0] = CGRectMake(0.0, 0.0, 0.0, 0.0); //doesn't work - compiler error 
[vertexAttributeArray rect][0] = CGRectMake(0.0, 0.0, 0.0, 0.0); //works fine 

첫 번째 :

내 메쉬 클래스 내에서
//VertexAttributeArray.h 

@interface VertexAttributeArray : NSObject 
{ 
    NSMutableData *vertexData; 
} 

- (void *)data; 
- (CGRect *)rect; 

//VertexAttributeArray.m 

- (id)init 
{ 
    self = [super init]; 

    if(self) 
    { 
     vertexData = [[NSMutableData alloc] initWithLength:0]; 
    } 

    return self; 
} 

- (void *)data 
{ 
    return [vertexData mutableBytes]; 
} 

- (CGRect *)rect 
{ 
    return [vertexData mutableBytes]; 
} 

- (void)dealloc 
{ 
    if(vertexData) 
    { 
     [vertexData release]; 
     vertexData = nil; 
    } 

    [super dealloc]; 
} 

는, 내가 좋아하는 뭔가를 호출 할 수 싶습니다 테스트, 나는 NSMutableData의 다음 클래스 만들기 사용을 작성했습니다 메소드가 data에 액세스하는 것이 클래스가 특정 유형의 구조체와 작동하도록 제한하지 않으므로 Xcode가 "불완전 유형 'void'을 지정할 수 없다는 경고를 던지기 때문에 선호됩니다."

다른 유형의 데이터 구조에 대해 여러 가지 방법을 사용하고 싶지 않지만 현재이 문제를 해결할 방법이 없습니다. 다른 유형에 대한 포인터를 반환하는 메소드를 사용하는 것은 매우 우아 해 보이지 않으며 흔히 사용되지 않는 (그리고 원치 않는) 코드를 많이 추가합니다.

이 문제를 해결하기 위해 불가지론 데이터 저장소를 만드는 방법이 있습니까? 버텍스, 인덱스, 법선 및 색상 등을 저장하는 메쉬 클래스가 다른 VertexAttributeArray 인 것을 선호하므로 vector2, vector3 및 vector4를 저장하는 것이 이상적입니다. 이 문제를 해결하려면 어떻게해야합니까?

답변

0

원하는 것을 할 방법이 없습니다. data 안에있는 객체의 크기를 컴파일 할 때 알려지지 않았습니다. ((void *)foo)[x]은 C에서도 불법입니다. 컴파일러는 배열 내부에 어떤 구조체가 저장되어 있는지를 알아야합니다. 그 이후는 data 내부의 객체 사이의 sizeof(CGRect) 거리가 있다고 알려져, 당신이 선호하는 경우

((CGRect *)[vertexAttributeArray data])[0] = CGRectMake(0.0, 0.0, 0.0, 0.0); 

:

당신은 호출을 변경할 수 있습니다.

+0

멋진. 나는 그것이 사실일지도 모른다라고 생각했다. 대답 해 주셔서 감사합니다. – CaptainRedmuff

관련 문제