На какой тип памяти выделяется структура C при инициализации в качестве переменной класса в Objective-C - PullRequest
3 голосов
/ 09 января 2009

Рассмотрим следующее:

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 байтов, выделенных структурой, когда переменная "matrix" больше не актуальна (или когда освобождается весь объект)?

Ответы [ 3 ]

6 голосов
/ 09 января 2009

В этом случае матрица должна быть встроена в структуру , которая генерируется компилятором 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, в зависимости от вашей целевой архитектуры.

3 голосов
/ 09 января 2009

В этом случае абсолютно ничего не нужно делать со структурой, чтобы освободить ее память, когда объект, содержащий ее, освобожден. Память для структуры встроена в объект.

1 голос
/ 09 января 2009

Кроме того, структура 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 также предоставляет некоторые очень удобные функции для работы с этими матрицами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...