记忆管理问题

时间:2010-10-12 12:22:03

标签: iphone objective-c memory

我想澄清一些事情:

当我以编程方式添加UIVIEW到另一个UIVIEW时。

[theview addsubview:thechildview];

我需要释放子视图,因为视图会增加保留计数。

右?

所以基本上如果我有一个循环,我正在使用该循环初始化子视图并将子视图添加到视图中:

for(int i=0;i<10;i++){

    UIView *child = [UIview alloc]init.....
    [parent addSubview:child];
    [child release];
}

我还需要释放孩子吗?那么这意味着子视图的保留计数仍为1吗?

事情就是每当我在加入孩子后调用释放后,孩子会在一段时间后被解除分配。

你们可以通过释放孩子后确认我做了正确的事吗?

感谢。

2 个答案:

答案 0 :(得分:3)

你应该把它放到某处,正确。你可以坚持下去并在以后发布它,但是你有责任在某些时候这样做。

父视图将自行保留/释放其子级。因此,如果父视图被dealloc'ed,它将释放其子视图。

如果从超级视图中删除子视图,它也将被释放。

答案 1 :(得分:2)

  

我需要释放子视图,因为视图会增加保留计数。

     

错误。

如果您拥有它,并且已经完成使用,则需要释放theChildView。视图是否选择保留它完全无关紧要。

所以,如果我们看看你的循环

for(int i=0;i<10;i++){

    UIView *child = [UIview alloc]init.....
    [parent addSubview:child];
    [child release];
}

代码是正确的,因为在循环块的开头你alloc表示你拥有它的孩子,并且在循环结束时它将超出范围,这意味着你不再需要它所以你必须释放(或自动释放)它。

中间发生的事情是完全不相关的,你应该假设任何关于另一个对象上的任何特定方法的内容(除了它遵守Memory Management Rules)。

  

我还需要释放孩子吗?那么这意味着子视图的保留计数仍为1吗?

你不能假设保留计数。如果将对象移交给其他对象,parent可能会导致对象被多次保留。它可能会选择复制而不是保留它。如果它不需要保留引用它可能根本不保留它。

  

你们可以通过释放孩子后确认我做了正确的事吗?

不,你完成使用它后发布它是正确的。