3

次のことを考慮してください。

typedef struct
{
  float m00, m01, m02, m03;
  float m10, m11, m12, m13;
  float m20, m21, m22, m23;
  float m30, m31, m32, m33;
} Matrix;

@interface TestClass : NSObject
{
  Matrix matrix;
}

- (TestClass *) init;
@end

@implementation TestClass
- (TestClass *) init
{
  self = [super init];
  matrix = (Matrix) {1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
  return self;
}
@end

「マトリックス」変数が関連しなくなったとき(またはオブジェクト全体が解放されたとき)に、構造体で割り当てられた64バイトが適切に解放されるようにするにはどうすればよいですか?

4

3 に答える 3

6

この場合、TestClass のインスタンス用に ObjectiveC コンパイラによって生成される構造体にマトリックスを埋め込む必要があります。その有効期間は、int または float メンバーと同様に、それが属する TestClass のインスタンスにバインドされます。

ポインタを調べると、これを簡単にテストできます。

TestClass* testAddress = [[TestClass alloc] init];
Matrix* matrixAddress = &(testAddress->matrix);

int rawTest = (int) testAddress;
int rawMatrix = (int) matrixAddress;
int memberOffset = rawMatrix - rawTest;

printf("%i", memberOffset);

ここにはコンパイラはありませんが、悪意のある型キャストに関するいくつかの警告をつぶやき、とにかくコードを生成するだけだと思います。出力は、ターゲット アーキテクチャに応じて、4 または 8 のように一定である必要があります。

于 2009-01-08T22:42:23.217 に答える
3

この場合、構造体を含むオブジェクトの割り当てが解除されたときに、メモリを解放するために構造体に対して行う必要があることはまったくありません。構造体のメモリは、オブジェクト内でインライン化されています。

于 2009-01-08T22:57:52.497 に答える
1

余談ですが、Core Animationの構造体CATransform3Dは、マトリックスと同じ内部構造を持っています。

struct CATransform3D
   {
   CGFloat m11, m12, m13, m14;
   CGFloat m21, m22, m23, m24;
   CGFloat m31, m32, m33, m34;
   CGFloat m41, m42, m43, m44;
};

カスタムタイプを定義する代わりに、Appleが提供するこれを使用することをお勧めします。Appleは、これらの行列を操作するための非常に便利な関数もいくつか提供しています。

于 2009-01-09T01:02:55.210 に答える