使用自动释放返回对象但我仍然泄漏内存

时间:2010-03-12 19:46:11

标签: iphone objective-c memory-management memory-leaks autorelease

我正在泄露记忆:

我的自定义类:

+ (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]; }

在app delegate中我启动它:

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

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

这是怎么泄漏的?我正确地释放或自动释放它们。如果我不保留这些应用程序,应用程序会立即崩溃,因为我猜是提前释放。如果我添加另一个版本,它也会崩溃。

1 个答案:

答案 0 :(得分:2)

为什么你认为你在泄漏记忆?从那开始。你访问时崩溃了什么对象?这将告诉你最不可能与你的保留不相关的对象。如果我不得不猜测,我怀疑是initVector,因为它对于一个方法来说是一个非常奇怪的名字。它有什么作用?为什么它不被称为“init?”

这是线程代码吗?你通常比适当的做更多的保留/自动释放。您不需要保留对象以通过当前事件循环保持它。一般来说,您只保留ivars,因为这些是您在下一个事件循环中所需要的。如果你有很多要求在访问者之外保留的调用,那么你几乎肯定会错误地管理内存。以上应该是:

+ (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];

就个人而言,我会使用autorelease处理v1 / v2,因为我认为它使代码更易于维护和理解,但还有其他思想流派:

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