2012-04-13 6 views
8

저레벨 이미지 메모리를 다루는 Objective-C 프로그램을 작성 중입니다. 내 데이터 저장을 위해 ANSI-C 구조체를 사용하고 있습니다. 데이터를 저장하는 데이터가 100 % 데이터이며, 데이터를 조작 할 방법이 없기 때문에 전체 개체가 과도하게 보입니다. 특히, 색상 배열에 의존하는 사용자 정의 가능한 포스터 라이 제이션 알고리즘을 작성 중입니다. 여기서 일이 까다로워집니다. 내 색상을 3 개의 float 구조체 및 정수 플래그 (포스터 화 알고리즘과 관련이 있음)로 저장하고 있습니다. Everyhting은 ... 한 가지를 제외하고, 잘되어 가고NSMutableArray에 C 포인터 추가

[실제 질문]

내가있는 NSMutableArray 포인터를 추가하는 방법을 알아낼 수 없습니다! 객체를 추가하는 방법을 알고 있지만 구조체에 포인터를 추가하는 것이 더 어려워 보입니다. NSMutableArray가 내 포인터를 역 참조하고 구조체를 일종의 이상한 객체로 취급하고 싶지 않습니다. NSMutableArray 포인터를 자신의 컬렉션에 추가하려면합니다. 어떻게해야합니까? 사전에

감사합니다,

G

답변

15

이를 위해 정확하게 설계된 클래스가있다 : NSPointerArray. Apple의 문서 here을 참조하십시오. 임의 포인터의 경우 NSPointerFunctionsOpaqueMemoryNSPointerFunctionsOpaquePersonality 옵션을 사용하는 것이 좋습니다. NSPointerArray를 사용할 수없는 경우 (당신이 iOS 용 개발하는 경우)

는, 당신은 너무 느린 증명하지 않는 & 랩핑 포장의 오버 헤드만큼, -[NSValue valueWithPointer:]를 사용하여 포인터를 포장 할 수있다.

+0

오! 나는 결코 생각하지 않았을 것이다! 내가보기에, 고마워. :) –

+2

코코아에는 대부분의 사람들이 그리워하는 콜렉션 수업이 많이있다. 특히 NSMapTable이 유용하다. 전체 목록을 보려면 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Collections/Collections.html – andyvn22

+0

오! 고맙습니다! 내가 그 시간을 탐구해야 할 것입니다 - 한가지, 컴파일러에서 NSPointerArray를 타입으로 인식하는 데 문제가 있습니다 - 인식하기 위해 가져올 헤더 파일이 무엇인지 알고 있습니까? –

4

NSValue 개체에 포인터를 래핑 할 수 있습니다. 그들은 유지되지 않습니다 -

NSMutableArray * NewNonRetainingArray() { 
    CFAllocatorRef allocator = 0; /* << default */ 
    CFIndex capacity = 0; /* << no maximum */ 

    /* 
    0 for the callbacks will result in elements which are not reference counted. 
    you can write your own callbacks, if you like some extra diagnostics or 
    special behavior. see the CFArrayCallBacks structure for a full description 
    of all callbacks. 
    */ 
    const CFArrayCallBacks* const callbacks = 0; 
    return (NSMutableArray*)CFArrayCreateMutable(allocator, capacity, callbacks); 
} 

그러나, 당신이 거기에 NSObject의 물건 싶지 않을 것입니다 :

+0

재미있다! 고맙습니다 :) –

1

NSMutableArray 정말 당신이 원하는 경우에, 당신은이 방법을 사용할 수 있습니다.

이 접근법을 사용하면 CF/NS-Array의 요소가 포인터 또는 크기가 포인터와 같은 기본 값이 될 수 있습니다.

3

예 :

int aa=99; 
int *a=&aa; 
char bb='a'; 
NSMutableArray *MS=[NSMutableArray new]; 
[MS addObject:[NSValue valueWithPointer:a]]; 
[MS addObject:[NSValue valueWithPointer:&bb]]; 
int *c=[[MS objectAtIndex:0] pointerValue]; 
char *d=[[MS objectAtIndex:1] pointerValue]; 
관련 문제