Когда выпустить переменную в target-c - PullRequest
0 голосов
/ 28 января 2011

В моем контроллере представления есть следующая строка:

-(void) retrieveAccounts {
    accounts = [[NSMutableArray alloc] init];
    selAccounts=[[NSMutableArray alloc] init];
    NSString *url=[NSString stringWithFormat:@"https://host/accts"];
    processor=[[AsynConnectionProcessorController alloc] init];
    processor.delegate=self;
    processor.server=self.server;
    [processor createRequestfromURL:url];
}

Класс AsynConnectionProcessorController создает NSURLConnection для загрузки данных из URL-адреса в асинхронном режиме. Он создает соединение в методе createRequestfromURL. Позже, когда страница получена заведомо в connectionDidFinishLoading, я вызываю метод processData для делегата, который я задал во фрагменте выше. processData обновляет tableView и т. д.

У меня вопрос, когда я смогу освободить переменную процессора, созданную выше. Должен ли я звонить autorelease. Придет ли элемент управления к следующей строке кода, если я поставлю [выпуск процессора] после этой строки выше: [процессор createRequestfromURL: url]

Примечание. У меня раньше был похожий вопрос, но у него больше деталей, поэтому добавьте его в качестве отдельного вопроса.

Ответы [ 3 ]

2 голосов
/ 28 января 2011

Похоже, вам нужен процессор до вызова делегата, который выполняет processData.Вот что я обычно делаю:

  1. Объявите ваш протокол делегата таким образом, чтобы ссылка на объект, который делает вызов, была в методе, например connectionProcessor:didProcessData:
  2. В обратном вызове делегата,вызвать release для ссылки, переданной обратно в обратном вызове.

Таким образом, делегат решает, когда это будет сделано с объектом.

1 голос
/ 29 января 2011

Когда выпустить? Отпустите, когда вам больше не нужен объект, иначе вы тратите впустую память, это так просто.

Используйте autorelease только в случае необходимости, как в методах получения. Autorelease имеет некоторые небольшие накладные расходы + объекты, которые вам, скорее всего, не понадобятся, дольше сохраняются в памяти. Если у вас много автоматически выпущенных объектов, приложение iphone может быть закрыто, если системная память заполнена. На Mac вы не должны беспокоиться об авто-выпуске, я думаю, но все же лучше использовать авто-релиз, только если вам это действительно нужно.

Также, когда вы используете autorelease, вы должны убедиться, что вы не собираетесь использовать объект после того, как его текущий пул autorelease отключен => EXC_BAD_ACCES crash

0 голосов
/ 28 января 2011

Я давно не работал с target-c, поэтому возьмите это с огромной кучей соли, но я думаю, что это авто-релиз.Который освобождается при уничтожении автозапуска.

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