首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用自动释放返回对象,但仍会泄漏内存

使用自动释放返回对象,但仍会泄漏内存
EN

Stack Overflow用户
提问于 2010-03-13 03:46:11
回答 1查看 502关注 0票数 2

我正在泄露以下内容的内存:

我的自定义类:

代码语言:javascript
复制
+ (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]; }

在应用委托中,我启动它:

代码语言:javascript
复制
Vector *v1 = [[Vector alloc] initVector];
Vector *v2 = [[Vector alloc] initVector];       
Vector *vtotal = [[v1 add:v2] retain];

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-03-13 03:55:46

为什么你认为你在泄露内存?从这个开始。你在访问什么对象时会崩溃?这将告诉你最可能的保留不足的对象是什么。如果让我猜测,我会怀疑initVector,因为对于一个方法来说,它是一个非常奇怪的名字。是干什么的呢?为什么不直接叫它“init”呢?

这是线程化的代码吗?您所做的保留/自动释放操作比通常适当的操作要多得多。您不需要为了在当前事件循环中保留对象而保留该对象。一般而言,您只保留ivars,因为在下一个事件循环中需要这些变量。如果您有很多调用需要保留在访问器之外,那么您几乎可以肯定是在错误地管理内存。上面的内容应该是:

代码语言:javascript
复制
+ (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,因为我认为它使代码更容易维护和理解,但也有其他的思想流派:

代码语言:javascript
复制
Vector *v1 = [[[Vector alloc] initVector] autorelease];
Vector *v2 = [[[Vector alloc] initVector] autorelease];
Vector *vtotal = [v1 add:v2];
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2435379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档