【问题标题】:Objective-C memory management: What is happening when setting a retain property?Objective-C 内存管理:设置保留属性时发生了什么?
【发布时间】:2011-11-03 06:12:43
【问题描述】:
我想了解以下代码行的内存管理含义:
// in tableView:cellForRowAtIndexPath
cell.accessoryView = [[UIImageView alloc] initWithImage:
[UIImage imageNamed:@"test.png"];
我打电话给alloc,这通常意味着我在某个地方打电话给release。 UITableViewCell 的accessoryView setter 属性是retain,所以(我认为)单元格将“拥有”UIImageView。 上述代码行中关于内存管理的具体内容是什么?
【问题讨论】:
标签:
objective-c
ios
memory-management
uitableview
uiimageview
【解决方案1】:
如果您不在某处发布视图,那么它将被泄露。所以你可能想做
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】:
首先:+alloc 保留 UIImageView(或者,“你从 UIImageView 的所有权开始”)
第二:+imageNamed 自动释放 UIImage(或者,“+imageNamed 不给你 UIImage 的所有权”)
第三:accessoryView的setter保留UIImageView(或者,“辅助视图取得UIImageView的所有权”)
由于您现在有两个 UIImageView 所有者,这可能是一个泄漏,除非您有意保留它以供以后使用,并相应地对其进行管理。
【解决方案3】:
这样想:你调用了alloc/init,所以你拥有它。当您不再想拥有它时,您必须释放它。
您可以假设 cell.accessoryView 拥有所有权,除非文档另有说明(例如委托),因此一旦您将其分配给 cell.accessoryView,您可能不再需要拥有它。你应该释放它。
总而言之,该行至少保留了两次:一次使用 alloc/init,至少一次使用分配给 cell.accessoryView。你只负责一个版本,一个负责 alloc/init。