2011-08-24 66 views
0

我想了解以下行代码的内存管理的影响:Objective-C的内存管理问题

// in tableView:cellForRowAtIndexPath 
cell.accessoryView = [[UIImageView alloc] initWithImage: 
         [UIImage imageNamed:@"test.png"]; 

我打电话alloc这通常意味着我打电话release地方。 UITableViewCellaccessoryView设置属性是retain所以(我认为)该单元将“取得”UIImageView的所有权。 关于内存管理,上面的代码行究竟发生了什么?

回答

3

如果你没有在某个地方释放视图,那么它将被泄漏。所以,你可能想要做

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"test.png"]; 
cell.accessoryView = imageView; 
[imageView release]; 

,或者您也可以做

cell.accessoryView = [[[UIImageView alloc] initWithImage: 
        [UIImage imageNamed:@"test.png"] autorelease]; 
2

第一:+页头保留的UIImageView(或可选择, “你开始用的UIImageView的所有权”)

二:+ imageNamed自动释放的UIImage(或“+ imageNamed不给你的所有权在UIImage的“)

第三:对于accessoryView的二传手保留的UIImageView(或‘附属视图采取的UIImageView’)的所有权

既然你现在有两个业主为的UIImageView,这可能泄漏,除非你有意将它放在后面使用,并根据它进行管理ordingly。

1

认为它是这样的:你调用分配/初始化,所以你拥有它。当你不想拥有它时,你必须释放它。

您可以假设cell.accessoryView取得所有权,除非文档另有说明(如使用委托),因此一旦将其分配给cell.accessoryView,您可能不需要再拥有它。你应该释放它。

总之,该行至少保留两次:一次使用alloc/init,至少一次使用cell.accessoryView赋值。你只负责一个版本,一个是alloc/init。