2012-04-13 17 views
8

Sto scrivendo un programma Objective-C che si occupa di memoria immagine di basso livello. Sto usando le strutture ANSI-C per la memorizzazione dei miei dati - Gli oggetti in piena regola sembrano esagerati visto che i dati che sto memorizzando sono dati al 100%, senza metodi per operare su quei dati. Nello specifico, sto scrivendo un algoritmo di posterizzazione personalizzabile che si basa su una serie di colori: è qui che le cose si complicano. Sto memorizzando i miei colori come strutture di tre float e un flag intero (correlato all'algoritmo di posterizzazione in particolare). Everyhting sta andando bene, tranne che per una cosa ...Aggiungi puntatore C a NSMutableArray

[domanda effettiva]

io non riesco a capire come aggiungere i puntatori a un NSMutableArray! So come aggiungere un oggetto, ma aggiungere un puntatore a una struct sembra essere più difficile: non voglio che NSMutableArray deriferisca il mio puntatore e consideri la struct come una sorta di oggetto strano. Voglio che NSMutableArray aggiunga il puntatore alla sua raccolta. Come procedo a fare questo?

Grazie in anticipo,

G

risposta

15

C'è una classe progettata proprio per questo: NSPointerArray. Vedi i documenti di Apple here. Per i puntatori arbitrari, probabilmente vorrai utilizzare le opzioni NSPointerFunctionsOpaqueMemory e NSPointerFunctionsOpaquePersonality.

Se NSPointerArray non è disponibile (ad esempio, se si sta sviluppando per iOS), allora si potrebbe avvolgere i puntatori utilizzando -[NSValue valueWithPointer:], fino a quando il sovraccarico di avvolgere & Scartare non prova troppo lento.

+0

Oh mio! Non avrei mai pensato! Darei un'occhiata, grazie :) –

+2

Il cacao ha un sacco di classi di raccolta a cui la maggior parte delle persone manca - trovo che 'NSMapTable' sia particolarmente utile. Vedi l'elenco completo qui: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Collections/Collections.html – andyvn22

+0

Oh! Grazie! Dovrò approfondire un po 'di tempo - Una cosa, sto avendo problemi nel far riconoscere al compilatore NSPointerArray come un tipo - Sai per caso quale file di intestazione devo importare affinché venga riconosciuto? –

4

È possibile avvolgere i puntatori negli oggetti NSValue.

+0

Interessante! Grazie :) –

1

Se un NSMutableArray è davvero ciò che si desidera, è possibile utilizzare questo approccio:

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); 
} 

Tuttavia, non si vuole roba NSObject s in là - non saranno mantenute.

Utilizzando questo approccio, gli elementi della CF/NS-Array possono essere puntatori o qualsiasi valore primitivo la cui dimensione è uguale a un puntatore.

3

esempio:

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];