2011-06-15 49 views
0

我有以下类:我初始化了两次吗?

@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,因为我创建了一个Point2D实例和Object2D init方法中的Vector2d。

@class Vector2D; 

@interface Point2D : NSObject 
{ 
    CGFloat X; 
    CGFloat Y; 
} 


@interface Vector2D : NSObject 
{ 
    CGFloat angle; 
    CGFloat length; 
    Point2D* endPoint; 
} 

类Object2D,Point2D和Vector2D没有dealloc方法。

有什么建议吗?

回答

0

是的,你是。此外,如果你有 '保留' 属性上的属性,然后像这样的行...

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]; 
+0

我已经更新了添加'Object2D'实现的问题。属性具有分配属性。 – VansFannel 2011-06-15 14:43:20

+0

当你创建一个Object2D的实例并调用ball.position = etc等的时候,当你将这些变量分配给其他对象时,仍然创建两个实例,并且你的init方法中的分配也会泄漏,那么原始对象就是泄漏。 – 2011-06-15 14:51:55

+0

我不会在init方法中初始化这些对象。 – VansFannel 2011-06-15 17:46:19

0

是的,你正在为这些类中的每一个创建两个实例。而且他们确实有内置的方法,即使你没有自己声明它们。我会做X和Y 属性Point2D类的,这样你可以通过使用aPoint.X未经您initWithX:Y:方法更改它们,等

更一般地,我会建议使用Objective-C对象为你避免”已经完成了。当你的数据可以很容易地被包含在一个结构体中时,它可以使你的代码更加简化,以躲避Objective-C方法和内存管理的疯狂世界。

+0

感谢您的回答。他们是类,因为他们有方法。 – VansFannel 2011-06-15 14:17:21

+0

我明白了。我误解了你的最后一段代码是完整的接口代码。 – Luke 2011-06-15 14:23:17

+0

没问题!再次感谢。 – VansFannel 2011-06-15 14:28:55