Возврат объектов с автоматическим выпуском, но я все еще теряю память - PullRequest
2 голосов
/ 12 марта 2010

У меня течет память об этом:

мой пользовательский класс:

+ (id)vectorWithX:(float)dimx Y:(float)dimy{
return [[[Vector alloc] initVectorWithX:dimx Y:dimy] autorelease]; }


- (Vector*)add:(Vector*)q {
return [[[Vector vectorWithX:x+q.x Y:y+q.y] retain] autorelease]; }

в приложении делегат я инициирую:

Vector *v1 = [[Vector alloc] initVector];
Vector *v2 = [[Vector alloc] initVector];       
Vector *vtotal = [[v1 add:v2] retain];

[v1 release];
[v2 release];
[vtotal release];

Как это протекает? Я выпускаю или автоматически выпускаю их должным образом. Приложение вылетает немедленно, если я не сохраняю их из-за раннего выпуска, я думаю Также происходит сбой, если я добавляю другой релиз.

1 Ответ

2 голосов
/ 12 марта 2010

Почему вы думаете, что у вас течет память? Начни с этого. А к какому объекту у вас происходит сбой при доступе? Это, скорее всего, скажет вам, к какому объекту относится ваш недопоставленный. Если бы мне нужно было сделать предположение, я бы заподозрил initVector просто потому, что это очень странное имя для метода. Что оно делает? Почему это не называется просто "init?"

Это многопоточный код? Вы делаете намного больше сохранения / авто-релиза, чем обычно. Вам не нужно сохранять объект, чтобы удерживать его в текущем цикле событий. Вообще говоря, вы сохраняете только ивары, потому что это то, что вам нужно в следующем цикле событий. Если у вас есть много вызовов, которые нужно сохранить за пределами средств доступа, то вы почти наверняка неправильно управляете памятью. Выше должно быть:

+ (id)vectorWithX:(float)dimx y:(float)dimy
{
    return [[[Vector alloc] initVectorWithX:dimx y:dimy] autorelease];
}

- (Vector*)add:(Vector*)q
{
    return [Vector vectorWithX:(self.x + q.x) y:(self.y + q.y)];
}

...

Vector *v1 = [[Vector alloc] initVector];
Vector *v2 = [[Vector alloc] initVector];
Vector *vtotal = [v1 add:v2];
...
[v1 release];
[v2 release];

Лично я бы справился с v1 / v2 с помощью автоматического выпуска, потому что я думаю, что это делает код более понятным и понятным, но есть и другие подходы:

Vector *v1 = [[[Vector alloc] initVector] autorelease];
Vector *v2 = [[[Vector alloc] initVector] autorelease];
Vector *vtotal = [v1 add:v2];
...