【问题标题】:Potential leak detected for UIBarButtonItem which is autoreleased检测到自动释放的 UIBarButtonItem 的潜在泄漏
【发布时间】:2012-07-17 18:22:11
【问题描述】:

在下面的代码中,xCode 的 Build & Analyze 函数检测到了一个

在第 165 行分配并存储到“addButton”中的对象的潜在泄漏。

addButton 是一个 UIBarButtonItem,它使用了 barItemWithImage 类别(我读到过 here),它返回一个自动释放的对象。如果我不保留 addButtonItem,我会在尝试访问已发布的对象时遇到异常。

我在这里错过了什么?

        UIBarButtonItem *addButton;

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        addButton = [UIBarButtonItem barItemWithImage:[UIImage imageNamed:@"RedPlus.png"] target:self action:@selector(createStoryModal:)];
    }else {
        addButton = [UIBarButtonItem barItemWithImage:[UIImage imageNamed:@"RedPlusiPhone.png"] target:self action:@selector(createStoryModal:)];
    }

    [addButton retain];

    NSArray* toolbarItems = [NSArray arrayWithObjects:
                             addButton,
                             [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace 
                                                                           target:nil
                                                                           action:nil],
                             nil];

    [toolbarItems makeObjectsPerformSelector:@selector(release)];
    self.toolbarItems = toolbarItems;

分类代码:

    @implementation UIBarButtonItem(MyCategory)

+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image target:(id)target action:(SEL)action{
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setImage:image forState:UIControlStateNormal];
    [button setFrame:CGRectMake(0.0, 0.0, image.size.width, image.size.height)];
    [button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];

    return [[[UIBarButtonItem alloc] initWithCustomView:button] autorelease];
}

@结束

【问题讨论】:

  • 你说[addButton retain],但据我所知,从不发布它。添加发布声明,看看是否可以修复它。我看到您正在释放 toolbarItems,但添加它会增加其保留计数。

标签: objective-c memory-management memory-leaks


【解决方案1】:

静态分析器是对的。

删除这个:

[addButton retain];

还有这个:

[toolbarItems makeObjectsPerformSelector:@selector(release)];

而且你还泄露了UIBarButtonItem

NSArray 保留其元素。

其他地方可能存在其他内存问题,但这应该可以消除三个可见的问题/不良形式。

【讨论】:

    【解决方案2】:

    虽然该项目最初是一个自动释放的对象,但当您向它发送保留消息时,您现在是该对象的所有者,这意味着您必须释放它。 addButton 现在没有发布,所以会导致泄漏。

    此外,您在 toolBarItems 数组中分配/初始化 UIBarButtonItem。你也不释放这个 UIBarButtonItem。

    由于toolbarItems 数组将增加addButton 和您在数组中分配/初始化的UIBarButton 的retainCount,因此在声明该数组后释放两者是安全的。 (或者,为了清楚起见,在您将 self.toolbarItems 设置为该数组之后。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多