如何释放在不同AutoReleasePool中分配的对象?

时间:2010-03-22 11:58:04

标签: objective-c memory-management nsautoreleasepool

我在Objective-C中遇到内存管理问题。假设我有一个分配对象的方法,并将对该对象的引用存储为该类的成员。如果我第二次运行相同的函数,我需要在创建一个新对象之前释放它以替换它。假设函数的第一行是:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

这意味着将有一个不同的自动释放池。分配对象的代码如下:

if (m_object != nil)
    [m_object release];

m_object = [[MyClass alloc] init];
[m_object retain];

问题是程序在运行方法的最后一行时崩溃了:

[pool release];

我做错了什么?我该如何解决这个问题?

关心
艾伦

2 个答案:

答案 0 :(得分:2)

首先对目标c内存管理有一个大致的了解。你在这里混淆了很多不同的东西。例如,您不必保留m_object,因为alloc已经将保留计数设置为1.通常,在释放对象时,不要释放AutoReleasePool。就像我说的查找内存管理文档(实际上非​​常好)。

答案 1 :(得分:0)

自动释放池处理已经专门自动释放的对象

示例:

[object autorelease];

如果某些代码尝试自动释放对象,则必须在程序中至少有一个NSAutoreleasePool。如果这是您唯一的NSAutoreleasePool,那么释放池可能会导致您的问题。