Как освободить объект, размещенный в другом AutoReleasePool? - PullRequest
0 голосов
/ 22 марта 2010

У меня проблема с управлением памятью в Objective-C. Скажем, у меня есть метод, который выделяет объект и сохраняет ссылку на этот объект в качестве члена класса. Если я выполняю ту же функцию во второй раз, мне нужно выпустить этот первый объект, прежде чем создавать новый, чтобы заменить его. Предположим, что первая строка функции:

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

Это означает, что будет создан другой пул авто-релизов. Код для выделения объекта выглядит следующим образом:

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

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

Проблема в том, что программа вылетает при запуске последней строки метода:

[pool release];

Что я делаю не так? Как я могу это исправить?

С уважением
Alan

Ответы [ 2 ]

2 голосов
/ 22 марта 2010

Сначала получите общее представление о цели c управлением памятью. Вы путаете много разных вещей здесь. Например, вам не нужно сохранять m_object, так как alloc уже устанавливает счет сохранения на 1. Также обычно вы не освобождаете свой AutoReleasePool при освобождении объекта. Как я уже сказал, посмотрите документацию по управлению памятью (на самом деле, неплохо).

0 голосов
/ 22 марта 2010

Пулы с автоматическим освобождением обрабатывают объекты, которые были автоматически освобождены

Пример:

[object autorelease];

В вашей программе должен быть хотя бы один NSAutoreleasePool на случай, если какой-либо код попытается автоматически освободить объект. Если это ваш единственный NSAutoreleasePool, то освобождение пула может вызвать ваши проблемы.

...