Objective-C объект-ошибка утечки - PullRequest
0 голосов
/ 01 ноября 2011

Для программы ниже я получаю следующую ошибку: Потенциальная утечка объекта, расположенного в строке 50. Линия 50 указывает на эту линию-- self.receivedData = [[NSMutableData data] сохранить]; Я попытался освободить receiveData после этого оператора, но это выдает ошибку «объект высылается автосеррелом слишком много раз». Я не уверен, правильно ли я это делаю. Пожалуйста, помогите!

   - (void)viewDidLoad {

        NSURLRequest *theRequest = 
        [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://{your ip}:8080/activiti-rest/service/process-definitions?start=0&size=10&sort=id&order=asc"]                            cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                     timeoutInterval:10.0];

        NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

        if (theConnection) {       

            self.receivedData = [[NSMutableData data] retain];

        } else {


            UIAlertView *connectFailMessage = [[UIAlertView alloc] initWithTitle:@"NSURLConnection " message:@"Failed in viewDidLoad"  delegate: self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
            [connectFailMessage show];
            [connectFailMessage release];

        }

        [theConnection autorelease];

    }

Редактировать : в заголовочном файле он объявлен как @property(nonatomic,assign) NSMutableData *receivedData;
New Это работает после того, как я удалил эту строку [therenection autorelease]. Я сохранил свойство assign как в заголовочном файле и добавил [self.receiveData release], как вы и просили. Ранее оно не работало, потому что я сохранил эту строку [theConnection autorelease]. Я добавил ее, потому что мне было интересно, нужно ли мне освободить объектConnection также. Можете ли вы объяснить, почему это не должно быть выпущено? Он не выпущен нигде в коде, и он все еще работает ??

Ответы [ 4 ]

1 голос
/ 01 ноября 2011

Объявляется ли свойство receivedData как retain в соответствующем заголовочном файле? Это означает, что когда вы назначаете ему объект, ему автоматически отправляется сообщение retain. Вам не нужно звонить retain на это самостоятельно.

1 голос
/ 01 ноября 2011

Не видя больше кода, анализатор может быть сбит с толку.

Где находится ваш баланс-релиз?В -dealloc?

Почему это свойство не retain на первом месте?

Вы также должны освобождать объект в -dealloc.И вы до сих пор не ответили, почему объект не retain - это выглядит странно.

1 голос
/ 01 ноября 2011

self.receivedData указывает на свойство.Скорее всего, это свойство имеет установленный флаг «сохранить».Следовательно, это удержание для вас, и ваше явное удержание в строке является посторонним и вызывает проблему.

0 голосов
/ 01 ноября 2011

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

[self.receivedData release];
self.receivedData = [[NSMutableData data] retain];

Редактировать: Причина выше.Полученные данные объявлены как свойство «назначить».Следовательно, если вы присваиваете ему, не освобождая его в первую очередь, у вас возникает утечка памяти, если receiveData ранее содержал сохраненный объект.Конечно, вы можете изменить свойство с assign на retain, но откуда мне знать, что у него нет веских оснований для использования assign в первую очередь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...