2012-04-13 75 views
8

我正在編寫一個處理低級別圖像內存的Objective-C程序。我正在爲我的數據存儲使用ANSI-C結構 - 完全成形的對象看起來有點矯枉過正,因爲我存儲的數據是100%的數據,沒有方法來處理這些數據。具體來說,我正在編寫一個依賴於顏色數組的可自定義的海報化算法 - 這是事情變得棘手的地方。我將我的顏色存儲爲三個浮點數的結構體,以及一個整數標記(具體涉及後置算法)。 Everyhting進行的很順利,除了一件事......將C指針添加到NSMutableArray

[實際問題]

我無法弄清楚如何將指針添加到一個NSMutableArray!我知道如何添加一個對象,但添加一個指向結構體的指針似乎更加困難 - 我不希望NSMutableArray取消引用我的指針並將結構視爲某種奇怪的對象。我希望NSMutableArray將自己的指針添加到它的集合中。我如何去做這件事?

由於提前,

回答

15

還有正是爲此設計的一類:NSPointerArray。請參閱Apple的文檔here。對於任意指針,你可能會想要使用NSPointerFunctionsOpaqueMemoryNSPointerFunctionsOpaquePersonality選項。

如果NSPointerArray不可用(例如,如果你正在爲iOS開發),那麼你可以使用-[NSValue valueWithPointer:]換你的指針,只要包裝&解包並沒有證明過慢的開銷。

+0

噢,我的!我從未想過!我會看看,謝謝:) – 2012-04-13 05:16:38

+2

可可有許多集合類,大多數人錯過 - 我覺得'NSMapTable'特別有用。在這裏查看完整列表:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Collections/Collections.html – andyvn22 2012-04-13 05:23:43

+0

哦!謝謝!我將不得不深入研究一下 - 有一件事,我有問題讓編譯器將NSPointerArray識別爲一種類型 - 您是否碰巧知道需要導入哪個頭文件才能被識別? – 2012-04-13 05:31:23

4

您可以將指針包裝在NSValue對象中。

+0

有趣!謝謝 :) – 2012-04-13 05:18:35

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數組的元素可能是指針或其大小等於指針的任何原始值。

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