簡體   English   中英

在Objective-C中初始化為類變量時,在哪種內存上分配C結構

[英]On which kind of memory a C struct is allocated when initialized as a class variable in Objective-C

考慮以下:

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

如果“矩陣”變量不再相關(或者整個對象被釋放時),如何確保正確釋放分配給struct的64個字節?

在這種情況下,矩陣應該嵌入在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,具體取決於您的目標體系結構。

在這種情況下,當對包含它的對象進行解除分配時,您必須對結構進行任何操作以釋放其內存。 結構的內存在對象中是內聯的。

另外,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還為操作這些矩陣提供了一些非常方便的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM