我有一个使用tableview的应用程序,以及我作为子视图添加到每个自定义单元格的UIButton,如下所示:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
checkButton = [[UIButton buttonWithType:UIButtonTypeCustom] initWithFrame:CGRectMake(2.0, 2.0, 40.0, 40.0)];
[cell.contentView addSubview:checkButton];
// lot's of other code
return cell;
}
我认为一切正常,直到我开始使用Instruments来确保我没有任何内存泄漏,但我发现将UIButton添加为单元格的子视图就像在某种程度上导致UIKit中的泄漏。 / p>
具体来说,我每个单元格行都会出现内存泄漏(每次按钮被添加为子视图),泄漏的对象是“CALayer”,负责的框架为“ - [UIView _createLayerWithFrame:]”。 / p>
我在这里做错了吗?
答案 0 :(得分:5)
代码[UIButton buttonWithType]方法已包含initWithFrame方法。您只需使用CGRectMake,然后设置按钮的框架。
rectangle = CGRectMake(2.0f,2.0f,40.0f,40.0f);
checkButton = [UIButton buttonWithType:UIButtonTypeCustom];
checkButton.frame = rectangle;
答案 1 :(得分:0)
您是否已在物理设备或模拟器上对此进行了测试?
与实际设备代码相比,已知模拟器具有一些内存管理变化。 您应该始终在真实设备上运行内存泄漏测试。
否则,您的代码对我来说是正确的。
答案 2 :(得分:0)
checkButton是你班级的@property(保留)吗?
因为在这种情况下你应该在使用后将属性设置为null ...但是你不能因为单元格的细胞生命周期不在你的控制之下;你可以用局部变量做得更好。
另外,你应该在addSubview之后添加一个[checkButton release],因为addSubview代码是自己的retain / release