我正在泄露记忆:
我的自定义类:
+ (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];
这是怎么泄漏的?我正确地释放或自动释放它们。如果我不保留这些应用程序,应用程序会立即崩溃,因为我猜是提前释放。如果我添加另一个版本,它也会崩溃。
答案 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];