0

iOSアプリケーションの開発を始めたばかりですが、私の質問は単純な配列に関するものです。ゲームである私のアプリケーションは、CGPoint構造体を多用しています。オブジェクトではないため、NSArrayに直接配置することはできず、NSValue内でラップする必要があります。これは正常に機能します。

他の、ほとんどがサンプルコードでは、単純な配列の使用法がわかります(Cだと思いますか?):

CGPoint manyPoints[40];
manyPoints[0] = CGPointMake(23, 42);
// And so on...

メモリはどこに割り当てられていますか?いつ割り当てが解除されますか?渡すとどうなりますか?コピーされていますか?ObjectiveCに関してこのトピックについては何も見つかりませんが、代わりにどこを見ればよいかわかりません。

ボーナス質問:これはNSValuesを使用するNSArrayとどのように比較されますか?速いですか?

4

3 に答える 3

1

CGPointC構造体タイプです。宣言は、メモリをスタックに直接割り当てます。Cでは、構造体を値として直接渡すことができます。CGPointMake()はおそらく次のようになります。

struct CGPoint {
     CGFloat x;
     CGFloat y;
};
typedef struct CGPoint CGPoint;

 CGPoint CGPointMake(CGFloat x, CGFloat y)
 {
     CGPoint returnValue; // allocated directly on the stack
     returnValue.x = x;   // Do not confuse this with Objective-C dot notation.  It is NOT the same thing
     returnValue.y = y;
     return returnValue;
 }

これは完全に合法であり、構造体全体が戻り値としてスタックから コピーされます。

ボーナス質問:これはNSValuesを使用するNSArrayとどのように比較されますか?速いですか?

試してみてください。でも、答えは確かにイエスです。行うべきObjective-Cメッセージはありません。

于 2012-04-20T13:29:50.097 に答える
1

右-CGPoint単なるC構造体です。

メモリはどこに割り当てられていますか?

宣言どおり、スタック上。

を使用mallocした場合は、(最適化されていない限り)ヒープ上にあります。

いつ割り当てが解除されますか?

宣言されているように、スコープが終了すると、リージョンはスタックで再利用できます。

あなたがmallocそれを編集したなら、あなたはそれをしなければならないでしょうfree

渡すとどうなりますか?コピーされていますか?

それはあなたがそれをどのように渡すかに依存します。言語には、値と参照を渡すオプションがあります。

ObjectiveCに関してこのトピックについては何も見つかりませんが、代わりにどこを見ればよいかわかりません。

C本

ボーナス質問:これはNSValuesを使用するNSArrayとどのように比較されますか?速いですか?

スタックの割り当てとオブジェクトは、誤用される可能性があり、すべてに適切な用途がありますが、より高速です。

于 2012-04-20T13:21:20.417 に答える
1

このステートメントは、スタックCGPoint manyPoints[40];に40を割り当てます。これは、(一般に)それらを渡すことができないことを意味します。現在のスタックフレームを離れると(現在の中括弧のセットから外れる)、データは自動的に割り当て解除されます。CGPoints

次のこともできます。

CGPoint* manyPoints = malloc(40 * sizeof(CGPoint);

// blah

manyPoints[0] = CGPointMake(23, 42);

// I'm done now
free(manyPoints);

これについては、おそらくC(Objective Cではなく)の周りを検索する方が幸運です。

NSArrayはい、 /を使用するよりもほぼ確実に高速ですNSValue

于 2012-04-20T13:22:04.540 に答える