我在这方面泄漏了内存:
我的自定义类:
+ (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]; }
在应用程序委托(delegate)中我启动它:
Vector *v1 = [[Vector alloc] initVector];
Vector *v2 = [[Vector alloc] initVector];
Vector *vtotal = [[v1 add:v2] retain];
[v1 release];
[v2 release];
[vtotal release];
这是怎么泄漏的?我正确地释放或自动释放它们。如果我不保留这些,应用程序会立即崩溃,因为我猜是因为早期发布。如果我添加另一个版本,它也会崩溃。
最佳答案
你认为为什么会泄漏内存?从那开始。访问什么对象时会崩溃?这很可能会告诉您保留不足与哪个对象相关。如果我必须猜测,我会怀疑 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];
关于iphone - 使用自动释放返回对象,但我仍然泄漏内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2435379/