[英]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.