任何人都可以告诉我如何释放在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;
}
`
答案 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!