переменная должна быть освобождена или нет?iphone-SDK - PullRequest
2 голосов
/ 22 марта 2010

В следующем фрагменте кода (из книги) data - это NSDictionary * data; , определенный в заголовке (без свойства).

В viewDidLoad контроллера происходит следующее:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSArray *keys = [NSArray arrayWithObjects:@"home", @"work", nil];
    NSArray *homeDVDs = [NSArray arrayWithObjects:@"Thomas the Builder", nil];
    NSArray *workDVDs = [NSArray arrayWithObjects:@"Intro to Blender", nil];
    NSArray *values = [NSArray arrayWithObjects:homeDVDs, workDVDs, nil];
    data = [[NSDictionary alloc] initWithObjects:values forKeys:keys];

}

Поскольку я действительно новичок в объективе-c, может кто-нибудь объяснить мне, почему мне не нужно сохранять переменные ключи, homeDVD, workDVD и значения до выхода из функции?Я ожидал бы до выделения данных что-то вроде:

[keys retain];
[homeDVDs retain];
[workDVDs retain];
[values retain];

или нет? InitWithObjects копирует (рекурсивно) все объекты в новую таблицу?

Предполагая, что у нас не было последней строки (распределение данных), если мы выпустим все NSArrays до выхода из функции (или мы могли бы смело предполагать, что все NSArrays будут автоматически освобождены, поскольку alloc * 1022 отсутствует* за каждого?)

Спасибо !!!!

Ответы [ 2 ]

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

В Core Foundation большинство статических вызовов таких методов, как arrayWithObjects: возвращают автоматически выпущенные экземпляры, что означает, что вам не нужно (и даже не нужно!) Освобождать его самостоятельно.

Таким образом, ситуация после выполнения вашего кода такова, что все массивы, созданные вами с помощью arrayWithObjects: вызовы, автоматически высвобождаются, но сохраняются при добавлении в другой массив или словарь. Таким образом, homeDVD и workDVD сохраняются при добавлении в массив значений, а ключи и массивы значений сохраняются при добавлении в словарь данных.

Так что вам не нужно явно освобождать ваши массивы, но вам нужно будет в какой-то момент выпустить ваш словарь данных (возможно, в реализации метода dealloc).

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

NSDictionary копирует поле ключа, а сохраняет значения. Все остальные экземпляры автоматически выпускаются, поэтому вы не пропускаете ни одной версии или сохраняете (при условии, что вы выпустили data в методе dealloc).

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