我有一个用于我的表视图的自定义单元格,我使用界面构建器设计了该单元格。在.m文件中,我有一些这样的代码,用于从自定义单元格的包中获取xib。
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"SubItemsCustomCell" owner:self options:nil];
self = [nibArray objectAtIndex:0]; }
return self;
}
然后当我在cellForRowAtIndexPath方法中使用此单元格并将其传递给自动释放消息时
if (!cellForSubItems) {
cellForSubItems = [[[SubItemsCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SubItemCell"] autorelease];
}
当我滚动tableView给出消息时,它会崩溃,
-[SubItemsCustomCell release]: message sent to deallocated instance 0xed198b0
当我使用代码制作自定义单元格时,它从未崩溃,但它确实在这里,为什么会这样? 此外,当我不自动发布它,它运行绝对罚款,但显然它会有内存泄漏。 请帮我解决这个问题。在此先感谢。
编辑:我没有使用ARC。答案 0 :(得分:2)
您的init方法看起来非常错误。
在调用它时,已经分配了一个对象。然后,用从笔尖加载的内容替换该对象。在这里,您已经泄漏了应该首先发布的旧实例。来自nib的新对象是自动释放的(请参阅命名约定),因此您应该在此处保留它。
我强烈建议完全删除该伪造的代码。你不想手动调用alloc / init,只是用那里的nib替换它。直接从笔尖加载。
所以是的,您的代码可能会泄露,但可能不是您想象的那样。
答案 1 :(得分:1)
尝试使用我的波纹管代码在UITableView
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
SubItemsCustomCell *cell = (SubItemsCustomCell *) [tableView dequeueReusableCellWithIdentifier:nil];
if (cell == nil)
{
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"SubItemsCustomCell" owner:self options:nil];
for (id currentObject in topLevelObjects){
if ([currentObject isKindOfClass:[UITableViewCell class]]){
cell = (SubItemsCustomCell *) currentObject;
break;
}
}
///do something here
}
return cell;
}
我希望这可以帮助你...
:)