2012-04-13 19 views
8

Estoy escribiendo un programa Objective-C que se ocupa de la memoria de imágenes de bajo nivel. Estoy usando estructuras ANSI-C para el almacenamiento de mis datos: los objetos completos parecen excesivos ya que los datos que estoy almacenando son 100% de datos, sin métodos para operar con esos datos. Específicamente, estoy escribiendo un algoritmo de posterización personalizable que se basa en una variedad de colores: aquí es donde las cosas se ponen difíciles. Estoy almacenando mis colores como estructuras de tres flotadores y una bandera entera (relacionada específicamente con el algoritmo de posterización). Todo lo demás va bien, excepto por una cosa ...Agregue el puntero C a NSMutableArray

[pregunta real]

no puedo encontrar la manera de añadir punteros a un NSMutableArray! Sé cómo agregar un objeto, pero agregar un puntero a una estructura parece ser más difícil. No quiero que NSMutableArray elimine la referencia de mi puntero y trate la estructura como un tipo de objeto extraño. Quiero que NSMutableArray agregue el puntero a su colección. ¿Cómo voy a hacer esto?

Gracias de antemano,

G

Respuesta

15

Hay una clase diseñada precisamente para esto: NSPointerArray. Consulte los documentos de Apple here. Para punteros arbitrarios, es probable que desee utilizar las opciones NSPointerFunctionsOpaqueMemory y NSPointerFunctionsOpaquePersonality.

Si NSPointerArray no está disponible (por ejemplo, si está desarrollando para iOS), entonces usted puede envolver sus punteros usando -[NSValue valueWithPointer:], siempre y cuando la sobrecarga de envolver & desembalaje no resultar demasiado lento.

+0

Oh! ¡Yo nunca lo hubiera pensado! Voy a echar un vistazo, gracias :) –

+2

Cocoa tiene muchas clases de colección que la mayoría de la gente echa de menos. Encuentro 'NSMapTable' particularmente útil. Vea la lista completa aquí: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Collections/Collections.html – andyvn22

+0

¡Oh! ¡Gracias! Tendré que profundizar en eso en algún momento. Una cosa es que tengo problemas para que el compilador reconozca NSPointerArray como un tipo. ¿Sabes qué archivo de encabezado debo importar para que se reconozca? –

4

Puede ajustar sus punteros en objetos NSValue.

+0

¡Interesante! Gracias :) –

1

Si un NSMutableArray es realmente lo que quiere, se puede utilizar este enfoque:

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

Sin embargo, usted no tendrá que rellenar NSObject s allí - que no se conservarán.

Usando este enfoque, los elementos de su CF/NS-Array pueden ser punteros o cualquier valor primitivo cuyo tamaño sea igual a un puntero.

3

ejemplo:

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