Предупреждение об утечке памяти при освобождении, но не при автоматическом выпуске - PullRequest
2 голосов
/ 07 марта 2011

У меня проблема с предупреждением об утечке памяти при освобождении объекта после его возврата. Я прочитал несколько постов на подобную тему, но в тех постах проблема с выпуском заключалась в том, что в итоге «им» не принадлежал объект, который они выпускали.

Если я использую autorelease при инициализации того же объекта, у меня не возникает проблем. Мой вопрос: если Apple предлагает выпустить вручную все объекты, которые мы создали, почему я получаю эти предупреждения?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";

    //Display no cells until it loads
    if([items count] < numberOfItemsToDisplay){

        UITableViewCell *cell = [[[UITableViewCell alloc] init]autorelease]; 
        return cell;
        //[cell release];

    }

У меня нет проблем с автоматическим выпуском объектов, но я ненавижу не понимать то, что мне показалось понятным:)

Спасибо, L

Ответы [ 4 ]

2 голосов
/ 07 марта 2011

Apple не говорит " вручную освободить все объекты, которые вы создаете" - они просто говорят "освободить в конечном итоге все объекты, которые вы создаете". Это может быть сделано ручным выпуском или автоматическим выпуском.

Авто-релиз - это в основном просто ручное освобождение, которое происходит в более поздний момент (в момент, когда вызывается [NSAutoreleasePool drain] или [NSAutoreleasePool release]).

Если вы хотите, чтобы один из ваших методов возвратил объект, принадлежащий вызывающей стороне, вы должны использовать autorelease, потому что, если вы вызываете release до того, как ваш 'return' и значение retain обнуляется, оно обнуляется (что обычно бывает Вы только что сделали объект), тогда объект будет немедленно удален и затем непригоден для использования. Вызывающий метод находит себя с указателем на какой-то не-объект мусора.

1 голос
/ 07 марта 2011

После оператора return функция возвращается и ничего больше не выполняется. Так что отпуск после возврата не будет выполнен. Таким образом, вы будете терять память. И вы не можете отпустить до возврата, так как вызывающая сторона будет использовать этот объект. Таким образом, вы действительно не можете выпустить это до возвращения. Таким образом, у вас есть два способа справиться с этой ситуацией. 1-й вариант - сделать возвращенный объект авто-релизом. Другой вариант - сделать имя функции таким образом, чтобы вызывающая сторона знала, что она владеет возвращаемым объектом и должна его освободить.

Проверьте Возвращение объектов из методов из Руководства по программированию для управления памятью для подробного объяснения этого случая.

0 голосов
/ 07 марта 2011

Добавьте класс UitableView в xcode, и он автоматически добавит делегатов правильно для повторного использования ячеек таблицы.

0 голосов
/ 07 марта 2011

Когда вы return cell не владеете объектом после этой точки и, следовательно, вы не можете release его.Когда оператор return выполняется, функции возвращаются в ту точку, откуда он был вызван.Поэтому операторы после return не выполняются.Поэтому, когда u release cell после return не выполняется, это означает, что cell не освобождается.Следовательно это вызывает предупреждение памяти.

...