2012-04-13 6 views
8

私は、低レベルのイメージメモリを扱うObjective-Cプログラムを書いています。私は自分のデータストレージにANSI-C構造体を使用しています。データが100%データであり、そのデータを操作するメソッドがないため、完全なオブジェクトが見えているようです。具体的には、私は色の配列に依存するカスタマイズ可能なポスタリゼーションアルゴリズムを書いています - これは物事が面倒なところです。私は3つの浮動小数点数の構造体と整数フラグ(ポスタリゼーションアルゴリズムに関連したもの)として色を保存しています。 Everyhtingは...一つのことを除いて、うまくいっているNSMutableArrayへのCポインタの追加

[実際の質問]

私はNSMutableArrayのへのポインタを追加する方法を見つけ出すことはできません!私はオブジェクトを追加する方法を知っていますが、構造体へのポインタを追加することは難しいようです - 私はNSMutableArrayが私のポインタを間接参照し、構造体を何らかの奇妙なオブジェクトとして扱うことは望ましくありません。 NSMutableArrayのポインタを自分自身のコレクションに追加します。これをどうやって行うのですか?事前に

おかげで、

G

答えて

15

このために正確に設計されたクラスがあります:NSPointerArray。 Appleのドキュメントhereを参照してください。任意のポインタの場合は、おそらくNSPointerFunctionsOpaqueMemoryNSPointerFunctionsOpaquePersonalityのオプションを使用します。 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オブジェクトにポインタをラップすることができます。彼らは保持されません -

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 Sを詰め込むする必要はありません。

+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]; 
関連する問題