1. ホーム
  2. iphone

[解決済み] NSArrayにc-structを格納する最も良い方法は何ですか?

2023-04-16 11:52:06

質問

c-structuresを格納する通常の方法は何ですか? NSArray ? 利点、欠点、メモリ処理?

特筆すべきは valueWithBytesvalueWithPointer --以下、justinとcatfishが提起。

以下はリンクです。 に関する Apple の議論へのリンクです。 valueWithBytes:objCType: へのリンクです。

水平思考とパフォーマンスをより重視するために、Evgen は STL::vector C++ .

(これは興味深い問題を提起します: 高速な c ライブラリはありますか? STL::vector とは違って、もっとずっと軽くて、最小限の "tidy handling of arrays" を可能にする高速な C ライブラリはないのでしょうか...?)

では、最初の質問ですが...

例えば

typedef struct _Megapoint {
    float   w,x,y,z;
} Megapoint;

では、このような自分自身の構造を NSArray に格納する方法、そしてその方法でメモリをどのように扱うか?

私は構造体を格納するための通常のイディオムを特に探していることに注意してください。 もちろん、新しい小さなクラスを作成することによって、この問題を回避することもできます。しかし、私は実際に構造体を配列に置くための通常のイディオムを知りたいのです。

ところで、これは NSData のアプローチですが、おそらくベストではないでしょう...

Megapoint p;
NSArray *a = [NSArray arrayWithObjects:
    [NSData dataWithBytes:&p length:sizeof(Megapoint)],
    [NSData dataWithBytes:&p length:sizeof(Megapoint)],
    [NSData dataWithBytes:&p length:sizeof(Megapoint)],
        nil];

ところで、参考までに Jarret Hardie 氏のおかげで、以下のような方法で CGPoints と同様のものを NSArray :

NSArray *points = [NSArray arrayWithObjects:
        [NSValue valueWithCGPoint:CGPointMake(6.9, 6.9)],
        [NSValue valueWithCGPoint:CGPointMake(6.9, 6.9)],
        nil];

(参照 NSArray に CGPoint オブジェクトを簡単に追加するにはどうすればよいですか? )

どのように解決するのですか?

NSValue は CoreGraphics の構造体をサポートするだけでなく、独自の構造体にも使用することができます。このクラスはおそらく NSData よりも軽量です。

以下のような式を使うだけです。

[NSValue valueWithBytes:&p objCType:@encode(Megapoint)];

そして、値を元に戻すには

Megapoint p;
[value getValue:&p];