1

在以下代码中,xCode 的 Build & Analyze 函数检测到

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

addButton 是一个 UIBarButtonItem 使用类别 barItemWithImage (我在这里读到),它返回一个自动释放的对象。如果我不保留 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];
}

@结尾

4

2 回答 2

2

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

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

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

于 2012-07-17T18:32:24.177 回答
2

静态分析器是对的。

删除这个:

[addButton retain];

还有这个:

[toolbarItems makeObjectsPerformSelector:@selector(release)];

而且您还泄漏了UIBarButtonItem.

NSArray保留其元素。

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

于 2012-07-17T18:32:52.060 回答