Objective-c内存管理问题

时间:2011-08-24 23:40:35

标签: objective-c ios memory-management uitableview uiimageview

我想了解以下代码行的内存管理含义:

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

我正在呼叫alloc,这通常意味着我在某个地方呼叫releaseUITableViewCell的{​​{1}} setter属性为accessoryView,因此(我认为)该单元格将“取得retain的所有权”。 关于内存管理的上述代码行究竟发生了什么?

3 个答案:

答案 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版本。