gpt4 book ai didi

iphone - UITableView 单元格内存泄漏

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:20:10 24 4
gpt4 key购买 nike

我正在填充数据的 TableView 出现泄漏。

这是正在发生的事情:

我有一个 NSMutableArray 充满了 NSDictionaries (联系信息),每当用户选择一个新的索引字母时,我从 sql 数据库加载它,数组充满了这些联系人的信息。

因为我使用一个实例变量数组来保存数据,所以我在每次换入新数据之前都会想出这样的事情:

if (currentConnections != nil) {
[currentConnections release];
currentConnections = nil;
}

在我重置之前会有效地删除我的旧数据。
然而,这就是奇怪的开始。在我的 tableView:cellForRowAtIndexPath: 中,我这样调用:

NSString *firstname = [[currentConnections objectAtIndex:indexPath.row]
objectForKey:@"firstname"];
UILabel *name = [[UILabel alloc]
initWithFrame:CGRectMake(75, 12, 190, 15)];
name.font = [UIFont fontWithName:@"Gotham-Medium.ttf"
size:12];
name.textColor = [UIColor whiteColor];
name.backgroundColor = [UIColor clearColor];
name.text = firstname;

其中当前连接是字典数组。然后我将 UILabel 添加为单元格的 subview :

[cell addSubview:name];
[name release];

由此产生的行为是这样的:

当我按原样运行时(在每次交换之前释放当前连接,然后将新数据加载到其中)应用程序将因访问错误而崩溃。
当我不释放我添加到单元格的 subview 时,应用程序不会崩溃,但我惊恐地看到实时字节继续在内存分配工具中累积,直到我切换联系人信息足够多以至于我收到内存警告然后崩溃.

在我看来,单元格和 subview 存在一些奇怪的内存所有权问题。我确实将单元格指定为可重用,并在为每个单元格加载数据之前将其分配给自动释放。

有什么可能导致此泄漏的想法吗?

编辑:

这是当前的 tableView:cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

static NSString *MyIdentifier = @"MyIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];

cell.accessoryType = UITableViewCellAccessoryNone;

if (cell == nil) {
NSLog(@"within");
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];
}

if (!ALOCATED) {


cellName = [[ UILabel alloc ]
initWithFrame:CGRectMake(75, 12, 190, 15)
];
cellName.font = [ UIFont
fontWithName:@"Gotham-Medium.ttf"
size:12
];
cellName.textColor = [ UIColor whiteColor ];
cellName.backgroundColor = [ UIColor clearColor ];

NSString *firstname = [[ currentConnections
objectAtIndex:indexPath.row
] objectForKey:@"firstname"
];

firstname = [ firstname stringByAppendingString:@" " ];

NSString *lastname = [[ currentConnections
objectAtIndex:indexPath.row
] objectForKey:@"lastname"
];

UIImage *profPic = [[ currentConnections
objectAtIndex:indexPath.row
] objectForKey:@"profilepicture"
];
connectionPhoto = [[ UIImageView alloc ] initWithFrame:CGRectMake(10, 8, 56, 56) ];
connectionPhoto.image = profPic;




NSString *fullname = [ firstname stringByAppendingString:lastname ];

cellName.text = fullname;


[ cell addSubview:cellName ];



cellTitle = [[ UILabel alloc ]
initWithFrame:CGRectMake(75, 31, 260, 13)
];
cellTitle.font = [ UIFont
fontWithName:@"ArialMT"
size:10
];
cellTitle.textColor = [ UIColor whiteColor ];
cellTitle.backgroundColor = [ UIColor clearColor ];
cellTitle.text = [[ currentConnections
objectAtIndex:indexPath.row
] objectForKey:@"title"
];


[ cell addSubview:cellTitle ];
[ cell addSubview:connectionPhoto ];
[ profPic release ];

ALOCATED = YES;

} else {



cellTitle.text = [[ currentConnections
objectAtIndex:indexPath.row
] objectForKey:@"title"
];

connectionPhoto.image = [[ currentConnections
objectAtIndex:indexPath.row
] objectForKey:@"profilepicture"
];


NSString *firstname = [[ currentConnections
objectAtIndex:indexPath.row
] objectForKey:@"firstname"
];

firstname = [ firstname stringByAppendingString:@" " ];

NSString *lastname = [[ currentConnections
objectAtIndex:indexPath.row
] objectForKey:@"lastname"
];
NSString *fullname = [ firstname stringByAppendingString:lastname ];

cellName.text = fullname;

}

return cell;

}

我试图创建一个单元格并重复使用它,每次只更改其 subview 的属性。

编辑

发生的事情是我将 subview 添加到单元格对象本身,这导致了泄漏,因为它们没有被释放。一旦我开始将 View 添加到 UITableViewCell 成员 View aka cell.contentView、cell.accessoryView 等......内存就被释放了。因此,正如丹尼尔在下面提到的,要么创建一个自定义表格单元格并将您的 View 添加到您的单元格属性,要么将您的 View 添加到成员 uitablecellviews 而不是单元格本身。以下对我有用:

   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

static NSString *MyIdentifier = @"MyIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];

cell.accessoryType = UITableViewCellAccessoryNone;

if (cell == nil) {

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];
}




UILabel *cName = [[ UILabel alloc ]
initWithFrame:CGRectMake(105, 10, 190, 15)
];
cName.font = [ UIFont
fontWithName:@"Gotham-Medium.ttf"
size:12
];
cName.textColor = [ UIColor whiteColor ];
cName.backgroundColor = [ UIColor clearColor ];

NSString *firstname = [[ currentConnections
objectAtIndex:indexPath.row
] objectForKey:@"firstname"
];

firstname = [ firstname stringByAppendingString:@" " ];

NSString *lastname = [[ currentConnections
objectAtIndex:indexPath.row
] objectForKey:@"lastname"
];

NSString *fullname = [ firstname stringByAppendingString:lastname ];

cName.text = fullname;

[ cell.contentView addSubview:cName ];
[ cName release ];



cell.imageView.image = [[ currentConnections
objectAtIndex:indexPath.row
] objectForKey:@"profilepicture"
];



UILabel *cTitle = [[ UILabel alloc ]
initWithFrame:CGRectMake(105, 25, 190, 13)
];
cTitle.font = [ UIFont
fontWithName:@"ArialMT"
size:10
];
cTitle.textColor = [ UIColor whiteColor ];
cTitle.backgroundColor = [ UIColor clearColor ];
cTitle.text = [[ currentConnections
objectAtIndex:indexPath.row
] objectForKey:@"title"
];


[ cell.contentView addSubview:cTitle ];
[ cTitle release ];

return cell;

}

最佳答案

如果您正在重复使用单元格,并且每次设置单元格时都会向其添加一个 UILabel,那么您可以看到分配了多少 UILabel,这可能会导致您的内存问题...如果您想将标签添加到单元格,你只需要在分配它时执行一次,然后如果单元格作为重用单元格进入,它已经包含你添加的 UILabel,所以你只需要编辑标签文本而不是添加一个新的 UILabel...这只是您发布内容的猜测,更多代码可能会澄清一些事情...

从您发布的代码中可以看出问题很明显,您正在泄漏单元格实例变量,还要记住 cellForRowAtIndexPath 会为表中的每一行调用,因此保留一个实例变量以保持添加到单元格中的某些内容的跟踪将不起作用,var 将继续被覆盖,但在您的情况下,您正在泄漏单元格。您正在向 UITableViewCell 添加单元格,从不释放它们,然后在下一次调用 cellForRowAtIndexPath 时,单元格 var 被覆盖并且前一个泄漏,因为您没有办法再释放它......您可以通过释放单元格来解决这个问题...

现在您还遇到了使用一个 var 来跟踪单元格上的标签的问题,请记住它不是一个单元格被分配用于重用,它实际上是屏幕上可以显示的所有单元格,所以保持跟踪一个 var 不起作用是你的问题......为了解决这个问题,我将使用标签属性将 UITableViewCell 子类化,并有一种方法来重置标签文本......

希望对你有帮助

关于iphone - UITableView 单元格内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9068415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com