gpt4 book ai didi

ios - 由dequeueReusableCellWithIdentifier引起的崩溃:用于自定义单元

转载 作者:行者123 更新时间:2023-12-01 18:18:01 24 4
gpt4 key购买 nike

更新-解决方法

我可以通过以下方法找到解决方法:(但是我仍然不明白为什么在dealloc中,即使我们不拥有[_profileImage release];allocnewcopy,在这种情况下我们也必须使用_profileImage)

MyUITableView.m

- (void)dealloc {
[_profileImage release];
// and all other ivars get released here

[super dealloc];
}

- (void)onClickLogoutButton {
if (_profileImage != nil) {
_profileImage = nil;
}
// and other operations
}

当我在 [_profileImage release];中有一个 onClickLogoutButton时,会发生崩溃,因为我不拥有(既不是 alloc也不是 new也不是 copy) _profileImage,而只是使用 _profileImage = [UIImage imageWithData:data];将对象传递给 _profileImage:
- (void)onClickLogoutButton {
if (_profileImage != nil) {
[_profileImage release];
_profileImage = nil;
}
// and other operations
}

原始问题

以下代码在iOS 7的Xcode 5中使用手动保留释放(MRR)。
ProfileCell *cell = (ProfileCell *)[tableView dequeueReusableCellWithIdentifier:identifierForProfileCell];导致崩溃,错误消息之一是 Thread 1: EXC_BAD_ACCESS (code=2, address=0x2448c90c)
是因为我放错了东西吗?但是我不确定何时何地发布什么。项目中有一个注销功能,注销后我们应该释放一些东西还是让dealloc来完成这项工作?首次登录,然后注销然后重新登录,滚动到配置文件单元,然后崩溃将发生错误。

注销后应该在 [self reloadData];中调用 MyUITableView.m吗?

MyUITableView.m
-(UITableViewCell *)tableView:(UITableView *)tableViewLeft cellForRowAtIndexPath:(NSIndexPath *)indexPath {

//ProfileCell
if ([indexPath section] == 0 && [indexPath row] == 0) {
static NSString *identifierForProfileCell = @"ProfileCell";

ProfileCell *cell = (ProfileCell *)[tableViewLeft dequeueReusableCellWithIdentifier:identifierForProfileCell]; // This line causes crash: Thread 1: EXC_BAD_ACCESS (code=2, address=0x2448c90c)

if (cell == nil) {
cell = [[[ProfileCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifierForProfileCell] autorelease];
}

[[cell textField] setText:_userID];
if (_profileImage == nil && _profileURL != nil) {
NSURL *url = [NSURL URLWithString:_profileURL];
NSURLRequest* request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * response, NSData * data, NSError * error) {
if (!error) {
_profileImage = [UIImage imageWithData:data];
[[cell iconView] setImage:_profileImage];
}
}];
}

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapSetting:)];
[singleTap setNumberOfTapsRequired:1];
[cell.settingWrapper addGestureRecognizer:singleTap];
[singleTap release];
return cell;
}
} else {
// ....
}
return nil;
}

最佳答案

您之前在tableView中注册过ProfileCell吗?

这样在viewDidLoad中:

- (void)viewDidLoad
{
[super viewDidLoad];
[self.tableView registerClass:ProfileCell forCellReuseIdentifier:@"ProfileCell"];
}

关于ios - 由dequeueReusableCellWithIdentifier引起的崩溃:用于自定义单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19770576/

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