сомнения по поводу сеттеров и геттеров - PullRequest
0 голосов
/ 16 июня 2011

У меня есть класс, Object2D, со следующим интерфейсом:

@class Point2D;
@class Vector2D;

@interface Object2D : NSObject
{
    Point2D* position;
    Vector2D* vector;
    ShapeType figure;
    CGSize size;
}

@property (assign) CGSize size;
@property ShapeType figure;

- (Point2D*) position;
- (void)setPosition:(Point2D *)pos;
- (Vector2D*) vector;
- (void)setVector:(Vector2D *)vec;
- (id)initWithPosition:(Point2D*)pos vector:(Vector2D*)vec;
- (void)move:(CGRect)bounds;
- (void)bounce:(CGFloat)boundryNormalAngle;
- (void)draw:(CGContextRef)context;

@end

И реализация:

@implementation Object2D

@synthesize size;
@synthesize figure;

- (Point2D*) position
{
    return position;
}
- (void)setPosition:(Point2D *)pos
{
    if (position != nil) {
        [position release];
    }
    position = pos;
}

- (Vector2D*) vector
{
    return vector;
}

- (void)setVector:(Vector2D *)vec
{
    if (vector != nil) {
        [vec release];
    }
    vector = vec;
}

...

- (void) dealloc
{
    if (position != nil) {
        [position release];
    }
    if (vector != nil) {
        [vector release];
    }
}

Я не использую @synthesize с position и vector, потому что я думаю, что я должен отпустить их, прежде чем изменять их значения.

У меня два вопроса:

Если я хочу получить значение позиции, это правильно? Получу ли я ссылку на должность или новую?

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* pos2;

pos2 = ball.position; <-- IS THIS CORRECT?

Второй вопрос:

Нужно ли освобождать предыдущие значения, прежде чем присваивать новые значения position и vector?

Ответы [ 2 ]

3 голосов
/ 16 июня 2011

Если вы используете ...

@property (nonatomic, retain) Point2D *position;

и то же самое для вектора, он сделает сохранение / освобождение для вас. (и @ynthesize их, очевидно!)

Так что, если вы сделаете следующее ....

Point2D *newPosition = [[Point2D alloc] init];
[myObject setPosition:newPosition];
[newPosition release];

OR

[myObject setPosition:[[[Point2D alloc] init] autorelease]];

Тогда удержания / релизы будут обработаны. Вам нужно будет добавить dealloc в ваш класс Object2D и выполнить EITHER ....

[position release];

OR

[self setPosition:nil];

оба освободят объект после очистки.

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

Я обнаружил ошибку в своем коде.Правильные методы установки могут быть:

- (void)setPosition:(Point2D *)pos
{
    [pos retain];
    [position release];
    position = pos;
}

- (void)setVector:(Vector2D *)vec
{
    [vec retain];
    [vector release];
    vector = vec;
}
...