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

在这种情况下,矩阵应该嵌入到由 ObjectiveC 编译器为 TestClass 的实例生成的结构中。它的生命周期绑定到它所属的 TestClass 的实例,就像 int 或 float 成员一样。

如果您检查指针,您可以轻松地对此进行测试。

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

顺便说一句,核心动画结构 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 回答