2

我正在泄漏内存:

我的自定义课程:

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

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

4

1 回答 1

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];
于 2010-03-12T19:55:45.820 回答