如何发布UIButton的背景图片?

时间:2011-05-02 10:37:21

标签: iphone memory-management uiimage

任何人都可以告诉我如何释放在UIButton中用作背景图像的图像。我使用以下代码创建了自定义按钮,但我无法释放在UIButton中设置背景图像的UIImage的内存。这是我用来创建UIButton的代码

`

   for (int index=0;index<10; index++)

   {            
    UIImage *image=[[UIImage alloc] initWithData:imageData];


    CGRect frame = CGRectMake(xValue, 10, 50, 50);  
    UIButton *button = [[UIButton alloc] initWithFrame:frame];

    [button addTarget:self action:@selector(onClickImgButton:)forControlEvents:UIControlEventTouchUpInside];
    [button setTag:index];      
    [button setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];     
    [button setImage:image forState:UIControlStateNormal];                      
    [button.layer setCornerRadius:10.0f];
    [button.layer setMasksToBounds:YES];
    [button.layer setBorderWidth:3.0f];
    [button.layer setBorderColor:[[UIColor lightGrayColor] CGColor]];

    image=nil;
    [image release];


    [horizontalScrollView addSubview:button];
    button=nil; 
    [button release];


    xValue=xValue+60;
    cx +=60;
}

`

2 个答案:

答案 0 :(得分:2)

首先,你混合了你的     图像=无;     [image release];

顺序,你应该首先释放,而不是将指针设置为nil。现在你发送“释放”到零,没有任何反应。你正在为按钮顺便说一下。

现在,如果您想要从内存中释放图像,只要按钮使用它就不能这样做。因此,您必须从内存中释放按钮(在这种情况下,通过修复释放并将指针设置为nil,并从其超级视图中删除按钮)或执行

[button setImage:nil forState:UIControlStateNormal];

应将保留计数设置为0并最终解除图像

答案 1 :(得分:1)

在上文中,您将release消息发送给nil。通常会反过来,即

[image release];
image = nil;

犯了类似的错误here

但是,由于UIButton实例是(根据UIButton.h快速查看)保留图像,因此image = nil执行错误,即

[image release];

是对的。您目前正在对给定对象如何设置其中一个属性做出重大假设。

例如,假设在释放UIButton实例时会发生什么。当您将图像设置为release时,如何将nil发送到您保留的图像?按钮发现自己保留零图像。它会面临你给自己带来的同样问题 - 将release发送给nil!