iphone - 使用自动释放返回对象,但我仍然泄漏内存

标签 iphone objective-c memory-management memory-leaks autorelease

我在这方面泄漏了内存:

我的自定义类:

+ (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/

相关文章:

iphone - 如何在 iPhone 上使用 JSON 解码 UTF8 字符?

iphone - View 中包含什么以及 View Controller 中包含什么?

ios - 带有一个可见单元格 : determine which is most visible 的 UITableView

c++ - 动态内存管理场景

c - 如何使用 malloc 为 C 中的结构创建动态内存分配?

c++ - 与竞争特定内存地址(互斥锁暂停另一个)相比,circularBuffer 如何提高性能?

objective-c - 时钟指针旋转问题

iphone - 确定 segue 是否为 unwind segue?

objective-c - 识别正在通知的 BLE 设备

ios - 使 NSString 中的某些单词成为粗体和可点击的标签