释放在Objective C中的Dictionary中的View Controller

时间:2010-02-11 09:26:08

标签: objective-c xcode uiviewcontroller nsmutablearray nsdictionary

我的项目代码如下。我将视图控制器的视图添加到表视图的每个单元格。

一个数组,就像这些

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];

编写上面的代码后,数组是否可以指向视图控制器?

总结一下,问题是:

  • 实际字典包含什么? (它是保留视图控制器的数量还是仅保留视图控制器的参考)
  • 数组实际包含什么? (它是保留字典还是只是字典的引用?)
  • 这里我只想拥有一组视图控制器&每个视图控制器具有不同的值(为此我将字典添加到数组中)

2 个答案:

答案 0 :(得分:1)

将对象添加到集合(例如字典和数组)时,集合将保留要添加的对象。

如果您希望对象只在集合中生存,那么一个好习惯就是在将对象添加到集合之前自动释放对象,或者在将对象添加到集合之后显式释放对象,例如这样:

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

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

请记住,当从集合中删除对象时,集合将释放它。

这意味着如果集合是对象的唯一保留器,则在从集合中删除对象后将对其进行解除分配。

答案 1 :(得分:1)

字典和数组包含指向对象的指针,但这些类的内部实现并不重要。你需要注意的是对象的所有权。

查看http://boredzo.org/cocoa-intro/,特别是内存管理部分,其中说明:

  
      
  • 如果使用其选择器包含的方法创建对象   单词“alloc”或“new”,或者带有   名称中包含单词的函数   “创造”,然后你拥有它。
  •   
  • 如果使用其选择器的方法复制现有对象   包含单词“copy”,或来自a   名称中包含单词的函数   “复制”(或从中获取对象)   一个函数),然后你拥有副本。
  •   
  • 否则,您不拥有该对象。
  •   
  • 如果您拥有一个物品,则有义务将其释放。
  •   

在您的情况下,您使用-alloc创建对象,因此您拥有对象并对其负责。所以,是的,你需要在将它们添加到数组后释放它们。

NSArrayNSDictionary保留其成员,因此一旦您将对象添加到数组或字典中就可以安全地释放它,在该数组本身删除之前,该对象将不会被释放。对象或自己解除分配。

为了让自己更容易,您可以使用返回自动释放对象的便捷构造函数:

//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