我有以下课程:
@interface Object2D : NSObject
{
Point2D* position;
Vector2D* vector;
FigureType figure;
CGSize size;
}
@property (assign) Point2D* position;
@property (assign) Vector2D* vector;
@property (assign) CGSize size;
...
@end
及其实施:
@implementation Object2D
@synthesize position;
@synthesize vector;
@synthesize size;
- (id)init
{
if (self = [super init])
{
position = [[Point2D alloc] init];
vector = [[Vector2D alloc] init];
size.width = kDefaultSize;
size.height = kDefaultSize;
}
return self;
}
当我创建Object2D
的实例时,我正在这样做:
- (void) init
{
// Create a ball 2D object in the upper left corner of the screen
// heading down and right
ball = [[Object2D alloc] init];
ball.position = [[Point2D alloc] initWithX:0.0 Y:0.0];
ball.vector = [[Vector2D alloc] initWithX:5.0 Y:4.0];
}
我不确定我是否正在初始化两个Point2D
个对象和两个Vector2D
个对象,因为我在Object2D init方法中创建了Point2D和Vector2d的实例。
@class Vector2D;
@interface Point2D : NSObject
{
CGFloat X;
CGFloat Y;
}
@interface Vector2D : NSObject
{
CGFloat angle;
CGFloat length;
Point2D* endPoint;
}
类Object2D,Point2D和Vector2D没有dealloc方法。
有什么建议吗?
答案 0 :(得分:0)
是的,你是。此外,如果您在属性上有'retain'属性,那么这样的行......
ball.position = [[Point2D alloc] initWithX:0.0 Y:0.0];
你需要内存泄漏......
ball.position = [[[Point2D alloc] initWithX:0.0 Y:0.0] autorelease];
或
Point2D *point = [[Point2D alloc] initWithX:0.0 Y:0.0];
ball.position = point;
[point release];
答案 1 :(得分:0)
是的,您正在为每个类创建两个实例。并且他们确实内置了dealloc
个方法,即使您没有自己声明它们。我会创建Point2D类的X和Y 属性,这样您就可以在不使用initWithX:Y:
方法的情况下更改它们,只需使用aPoint.X
等。
更一般地说,我建议你不要像在这里那样使用Objective-C对象。当您的数据可以轻松地包含在结构中时,它可以使您的代码更加简化,以避开Objective-C方法和内存管理的疯狂世界。