Почему вы думаете, что у вас течет память? Начни с этого. А к какому объекту у вас происходит сбой при доступе? Это, скорее всего, скажет вам, к какому объекту относится ваш недопоставленный. Если бы мне нужно было сделать предположение, я бы заподозрил 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];