Av hvilken type hukommelse et C struct fordeles når initialisert som en klasse variabel i Objective-C

stemmer
3

Vurder følgende:

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

Hvordan sikre at de 64 bytes tildelte med struct er riktig utgitt når matrix variable ikke er relevant lenger (eller når hele objektet slippes)?

Publisert på 08/01/2009 klokken 22:12
kilden bruker
På andre språk...                            


3 svar

stemmer
6

I dette tilfellet matrisen skal være innebygd i struct som er generert av den Objective-C kompilator for forekomster av TestClass. Dens levetid er bundet til forekomsten av TestClass som det er en del av, på samme måte som en int eller flyteelementet ville være.

Du kan enkelt teste dette, hvis du inspisere pekere.

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

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

printf("%i", memberOffset);

Jeg har ingen kompilator her, men jeg antar det vil bare mumler noen advarsler om onde typecasts og generere koden anyways. Utgangen skal være konstant, noe som 4 eller 8, avhengig av målet arkitektur.

Svarte 08/01/2009 kl. 22:42
kilden bruker

stemmer
3

I dette tilfellet, er det absolutt ingenting du trenger å gjøre for å strukturen for å få frigjøre minnet når objektet som inneholder det deallocated. Minnet for strukturen er innebygd i objektet.

Svarte 08/01/2009 kl. 22:57
kilden bruker

stemmer
1

Som en side, har Core Animation struct CATransform3D samme interne strukturen som matrise:

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

I stedet for å definere en tilpasset type, kan du ønsker å bruke dette som Apple leverer. Apple gir også noen svært praktiske funksjoner for å manipulere disse matriser.

Svarte 09/01/2009 kl. 01:02
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more