【问题标题】: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,这通常意味着我在某个地方打电话给releaseUITableViewCellaccessoryView 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。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-12
          • 1970-01-01
          相关资源
          最近更新 更多