为自动释放的UIBarButtonItem检测到潜在泄漏

时间:2012-07-17 18:22:11

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

在下面的代码中xCode的Build&分析功能检测到

  

在第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];
}

@end

2 个答案:

答案 0 :(得分:2)

虽然该项目最初是一个自动释放的对象,但当您向其发送保留消息时,您现在是此对象的所有者,这意味着您必须将其释放。 addButton目前尚未发布,因此会导致泄密。

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

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

答案 1 :(得分:2)

静态分析仪是对的。

删除它:

[addButton retain];

和此:

[toolbarItems makeObjectsPerformSelector:@selector(release)];

你也泄漏了UIBarButtonItem

NSArray保留其元素。

其他地方可能存在其他内存问题,但这应该删除三个可见问题/错误表单。