Выпуск Контроллера Представления, которые находятся в Словаре в Задаче C - PullRequest
0 голосов
/ 11 февраля 2010

У меня есть код в моем проекте следующим образом. Я добавляю представление контроллеров представления к каждой ячейке представления таблицы.

Массив, подобный этому

NSMutableArray *arrTbl=[[NSMutableArray alloc] init];
NSMutableDictionary *dOne=[[NSMutableDictionary alloc] init];
myViewController *objVCtr=[[myViewController alloc] initWithNibName:@"myViewController" bundle:nil];
[dOne setValue:objVCtr forKey:@"cellVCtr"];

NSMutableDictionary *dTwo=[[NSMutableDictionary alloc] init];
myViewController *objVCtr1=[[myViewController alloc] initWithNibName:@"myViewController" bundle:nil];
[dOne setValue:objVCtr1 forKey:@"cellVCtr"];

NSMutableDictionary *dThree=[[NSMutableDictionary alloc] init];
myViewController *objVCtr2=[[myViewController alloc] initWithNibName:@"myViewController" bundle:nil];
[dOne setValue:objVCtr2 forKey:@"cellVCtr"];

[arrTbl addObjectsFromArray:[NSArray arrayWithObjects:dOne,dTwo,dThree,nil]];

Теперь вопрос в том, как выпустить это?

arrTbl - это основной массив со словарями и словарями, имеющими ссылки на контроллеры представления.

Так, я должен написать следующие утверждения после вышеупомянутых утверждений?

[dOne release];
[dTwo release];
[dThree release];
[objVCtr release];
[objVCtr1 release];
[objVCtr2 release];

После написания кода выше, массив может указывать на контроллеры представления или нет?

Подводя итог, вопросы:

  • Что на самом деле содержит словарь? (Сохраняет ли он количество контроллеров View или просто ссылку на контроллеры View)
  • Что на самом деле содержит массив? (Сохраняется ли количество словарей или просто ссылки на словари?)
  • здесь я просто хочу иметь массив контроллеров представления и каждый контроллер представления с различными значениями (для этого я добавляю словарь в массив)

Ответы [ 2 ]

1 голос
/ 11 февраля 2010

Словари и массивы содержат указатели на объекты, но внутренняя реализация этих классов не важна. На что нужно обратить внимание - это на владение объектами.

Взгляните на http://boredzo.org/cocoa-intro/,, в частности, на раздел управления памятью, который гласит:

  • Если вы создаете объект с методом, чей селектор содержит слово «выделить» или «новый», или с функция, имя которой содержит слово «Создайте», тогда вы владеете им.
  • Если вы делаете копию существующего объекта, используя метод, чей селектор содержит слово «копия», или из функция, имя которой содержит слово «Копировать» (или получить объект из такого функции), то у вас есть копия.
  • В противном случае вы не являетесь владельцем объекта.
  • Если вы владеете объектом, вы обязаны освободить его.

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

NSArray и NSDictionary сохраняют свои члены, поэтому после добавления объекта в массив или словарь его можно безопасно освободить, объект не будет освобожден, пока сам массив не удалит объект или не будет освобожден сам по себе.

Чтобы вам было проще, вы можете использовать вспомогательные конструкторы, которые возвращают автоматически выпущенные объекты:

//note the autorelease when the view controllers are created
MyViewController* viewController = [[[MyViewController alloc] initWithNibName:@"myViewController" bundle:nil] autorelease];
NSDictionary *dOne = [NSDictionary dictionaryWithObject:viewController forKey:@"cellVCtr"];


MyViewController *objVCtr1 = [[[MyViewController alloc] initWithNibName:@"myViewController" bundle:nil] autorelease];
NSDictionary* dTwo = [NSDictionary dictionaryWithObject:objVCtr1 forKey:@"cellVCtr"];

MyViewController *objVCtr2 = [[MyViewController alloc] initWithNibName:@"myViewController" bundle:nil];
NSDictionary* dThree = [NSDictionary dictionaryWithObject:objVCtr2 forKey:@"cellVCtr"];

NSArray* arrTbl = [NSArray arrayWithObjects:dOne, dTwo, dThree, nil];

//do something with arrTbl
//make sure you retain it if you want to hang on to it
1 голос
/ 11 февраля 2010

При добавлении объектов в коллекции (таких как словари и массивы) коллекция будет сохранять добавляемый объект.

Если вы хотите, чтобы объект жил только до тех пор, пока он находится в коллекции, хорошей привычкой является либо автоматическое освобождение объекта перед добавлением его в коллекцию, либо явное освобождение объекта сразу после добавления его в коллекцию, например так:

MyObject *anObject = [[[MyObject alloc] init] autorelease];
[aDictionary setObject:anObject forKey:@"aKey"];

или

MyObject *anObject = [[MyObject alloc] init];
[aDictionary setObject:anObject forKey:@"aKey"];
[anObject release];

Помните, что когда объект удаляется из коллекции, коллекция освобождает его.

Это означает, что если коллекция является единственным хранителем объекта, то объект будет освобожден после удаления из коллекции.

...