2012-04-13 1 views
8

Я пишу программу Objective-C, которая занимается памятью низкого уровня изображения. Я использую структуры ANSI-C для хранения своих данных. Полностью раздутые объекты кажутся чрезмерными, поскольку данные, которые я храню, являются 100% данными, без методов для работы с этими данными. В частности, я пишу настраиваемый алгоритм постеризации, который опирается на массив цветов - здесь все становится сложным. Я сохраняю свои цвета как структуры из трех поплавков и целочисленный флаг (специально предназначенный для алгоритма постеризации). Everyhting идет хорошо, за исключением одной вещи ...Добавить C указатель на NSMutableArray

[актуальный вопрос]

Я не могу понять, как добавить указатели к NSMutableArray! Я знаю, как добавить объект, но добавление указателя на структуру кажется более сложным - я не хочу, чтобы NSMutableArray разыменовывал мой указатель и рассматривал структуру как своего рода странный объект. Я хочу, чтобы NSMutableArray добавлял указатель в свою коллекцию. Как мне это сделать?

Спасибо заранее,

G

ответ

15

Там есть класс предназначен именно для этого: NSPointerArray. См. Документы Apple here. Для произвольных указателей вы, вероятно, захотите использовать опции NSPointerFunctionsOpaqueMemory и NSPointerFunctionsOpaquePersonality.

Если NSPointerArray не доступен (например, если вы разрабатываете для IOS), то вы можете обернуть указатели с помощью -[NSValue valueWithPointer:], до тех пор, как накладные расходы оберточной & развёрток не окажется слишком медленным.

+0

Ой! Я никогда бы не подумал! Я посмотрю, спасибо! –

+2

В Cocoa есть много классов коллекций, которые большинство людей пропустили - я нахожу «NSMapTable» особенно полезным. См. Полный список здесь: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Collections/Collections.html – andyvn22

+0

О! Спасибо! Мне придется вникать в это некоторое время. Одна вещь, у меня возникают проблемы с тем, чтобы компилятор распознал NSPointerArray как тип. Вы знаете, какой заголовочный файл мне нужно импортировать для его распознавания? –

4

Вы можете обернуть свои указатели в NSValue объектах.

+0

Интересно! Спасибо :) –

1

Если NSMutableArray действительно то, что вы хотите, вы можете использовать этот подход:

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 с в там - они не будут сохранены.

Используя этот подход, элементы 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]; 
Смежные вопросы