我正在泄露以下内容的内存:
我的自定义类:
+ (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];这是怎么泄露的?我正确地释放或自动释放它们。如果我不保留这些,应用程序就会立即崩溃,我猜是因为我发布的太早了。如果我添加另一个版本,它也会崩溃。
发布于 2010-03-13 03:55:46
为什么你认为你在泄露内存?从这个开始。你在访问什么对象时会崩溃?这将告诉你最可能的保留不足的对象是什么。如果让我猜测,我会怀疑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];就我个人而言,我会使用自动发布来处理v1/v2,因为我认为它使代码更容易维护和理解,但也有其他的思想流派:
Vector *v1 = [[[Vector alloc] initVector] autorelease];
Vector *v2 = [[[Vector alloc] initVector] autorelease];
Vector *vtotal = [v1 add:v2];https://stackoverflow.com/questions/2435379
复制相似问题