0

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

一个数组,像这些

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

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

概括起来,问题是:

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

2 回答 2

1

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

如果您希望对象只在集合中存在,一个好习惯是在将对象添加到集合之前自动释放对象,或者在将对象添加到集合之后显式释放对象,如下所示:

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

或者

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

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

这意味着如果集合是对象的唯一保留者,那么对象将在从集合中移除后被释放。

于 2010-02-11T09:39:18.430 回答
1

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

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

  • 如果您使用选择器包含单词“alloc”或“new”的方法或名称包含单词“Create”的函数创建对象,那么您拥有它。
  • 如果您使用选择器包含单词“copy”的方法或名称包含单词“Copy”的函数复制现有对象(或从此类函数获取对象),则您拥有该副本。
  • 否则,您不拥有该对象。
  • 如果你拥有一个物品,你有义务释放它。

在您的情况下,您正在使用创建对象-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
于 2010-02-11T09:55:51.377 回答