我想了解以下代码行的内存管理含义:
// in tableView:cellForRowAtIndexPath
cell.accessoryView = [[UIImageView alloc] initWithImage:
[UIImage imageNamed:@"test.png"];
我正在呼叫alloc
,这通常意味着我在某个地方呼叫release
。 UITableViewCell
的{{1}} setter属性为accessoryView
,因此(我认为)该单元格将“取得retain
的所有权”。 关于内存管理的上述代码行究竟发生了什么?
答案 0 :(得分: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];
答案 1 :(得分:2)
首先:+ alloc保留UIImageView(或者,“你从UIImageView的所有权开始”)
第二:+ imageNamed自动释放UIImage(或者,“+ imageNamed不会给你UIImage的所有权”)
第三:accessoryView的setter保留了UIImageView(或者,“附件视图取得了UIImageView的所有权”)
由于你现在有两个UIImageView所有者,这可能是一个泄密,除非你故意保留它以便以后使用,并相应地管理它。
答案 2 :(得分:1)
这样想:你正在调用alloc / init,所以你拥有它。当你不想再拥有它时,你必须释放它。
你可以假设cell.accessoryView取得所有权,除非文档另有说明(比如委托),所以一旦你将它分配给cell.accessoryView,你可能不再需要拥有它了。你应该释放它。
总之,该行至少保留两次:一次使用alloc / init,至少一次使用cell.accessoryView。您只负责一个版本,即alloc / init版本。