Я инициализирую дважды? - PullRequest
0 голосов
/ 15 июня 2011

У меня есть следующий класс:

@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 и Vector2d в методе инициализации Object2D.

@class Vector2D;

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


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

Классы Object2D, Point2D и Vector2D не имеют метода dealloc.

Любой совет?

Ответы [ 2 ]

0 голосов
/ 15 июня 2011

Да, вы создаете два экземпляра каждого из этих классов. И у них есть встроенные dealloc методы, даже если вы сами их не объявили. Я бы сделал X и Y свойства класса Point2D, чтобы вы могли изменить их без вашего initWithX:Y: метода, просто используя aPoint.X и т. Д.

В более общем смысле я бы рекомендовал избегать использования объектов Objective-C, как вы сделали здесь. Когда ваши данные могут быть легко помещены в структуру, это может сделать ваш код более упорядоченным, чтобы уклониться от безумного мира методов Objective-C и управления памятью.

0 голосов
/ 15 июня 2011

Да, вы. Кроме того, если у вас есть атрибут '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];
...