Пример TablewView в книге «Начинающий iPhone» - PullRequest
0 голосов
/ 09 июня 2011

Это, вероятно, глупый вопрос, но во введении к TableViews у автора есть свойство NSArray * listData для заполнения таблицы фиктивными данными.В viewDidLoad он в основном делает это:

- (void)viewDidLoad {
NSArray *array = [[NSArray alloc] initWithObjects@"1", @"2", @"3", more stuff, nil];
self.listData = array;
[array release];
...
}

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

- (void)viewDidLoad {
listData = [[[NSArray alloc] initWithObjects@"1", @"2", @"3", more stuff, nil]autorelease];

Для управления памятьюлучше использовать alloc / init vs пул авто-релиза?Или второй способ просто не сработает?Спасибо.

1 Ответ

1 голос
/ 09 июня 2011

Ваш код неверен и может привести к сбою.В своем коде он вызывает alloc, что означает, что счетчик сохранения равен 1. Затем он присваивает его свойству.Я предполагаю, что это свойство объявлено равным retain, и в этом случае счет удержания увеличится до 2. Затем он вызвал release, что уменьшает счет удержания до 1.

В вашемкод, вы вызываете alloc, что означает, что счетчик хранения равен 1, затем вы вызываете autorelease, что означает, что счетчик хранения уменьшится до 0, и память объекта будет вскоре освобождена.Вы присваиваете объект переменной экземпляра, а не сохраняемому свойству, как он делает, так что вы больше не будете увеличивать счет.Это означает, что у вас останется висячий указатель на память, который может быть перезаписан чем-либо другим в любое время.При попытке получить доступ к listData произойдет сбой, поскольку он, вероятно, был перезаписан.

Прочтите Руководство по программированию управления памятью , если вы не понимаете, что здесь происходит.

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

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