выпускать или не выпускать - PullRequest
1 голос
/ 01 июля 2011

Я разрабатываю приложение для iPhone.

У меня есть следующее свойство:

@property (nonatomic, retain) Point2D* endPoint;

И это метод того же класса:

- (id)initWithX:(CGFloat)x Y:(CGFloat)y;
{
    if (self = [super init])
    {
        endPoint = [[Point2D alloc] initWithX:x Y:y];

    ...
}

И, наконец, метод dealloc для того же класса:

- (void)dealloc {
    [endPoint release];
    [super dealloc];
}

Мой вопрос, верен ли этот код?

endPoint = [[Point2D alloc] initWithX:x Y:y];

Или, может быть, мне нужно сделать здесь авто-релиз.

Ответы [ 4 ]

5 голосов
/ 01 июля 2011

Прочтите руководство по управлению памятью , так как оно объяснит все это и многое другое.

Короче говоря, этот код правильный.

Если высделал self.endPoint = [... alloc/init ...], тогда вам нужно было бы автоматически выпустить или отпустить в init, чтобы сбалансировать дополнительное удержание.

1 голос
/ 01 июля 2011

Ваше назначение

endPoint = [[Point2D alloc] initWithX:x Y:y];

не увеличивает retainCount, поэтому, если вы хотите, чтобы endPoint использовался позже, здесь вы не используете авто-релиз.

Или вы можете использовать вот так

self.endPoint = [[[Point2D alloc] initWithX:x Y:y] autorelease];

=> Это назначение увеличит счетчик конечной точки.

0 голосов
/ 01 июля 2011

Вы не должны использовать endPoint напрямую, а через self.endPoint.

@property (nonatomic, retain) Point2D* endPoint;

- (id)initWithX:(CGFloat)x Y:(CGFloat)y;
{
    if (self = [super init])
    {
        self.endPoint = [[[Point2D alloc] initWithX:x Y:y] autorelease]; //It'll retain it for us.

    ...
}

- (void)dealloc {
    self.endPoint = nil; //setting it to nil means it'll release the object it was previously pointing to.
    [super dealloc];
}
0 голосов
/ 01 июля 2011

измените endPoint = [[Point2D alloc] initWithX:x Y:y]; на

Point2D *temp = [[Point2D alloc] initWithX:x Y:y];
self.endPoint = temp;
[temp release];

, чтобы воспользоваться преимуществами метода сохранения свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...