我的项目代码如下。我将视图控制器的视图添加到表视图的每个单元格。
一个数组,就像这些
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];
编写上面的代码后,数组是否可以指向视图控制器?
总结一下,问题是:
答案 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
创建对象,因此您拥有对象并对其负责。所以,是的,你需要在将它们添加到数组后释放它们。
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