Словари и массивы содержат указатели на объекты, но внутренняя реализация этих классов не важна. На что нужно обратить внимание - это на владение объектами.
Взгляните на 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