gpt4 book ai didi

ios - 在 iOS 上使用 ARC 进行内存管理

转载 作者:行者123 更新时间:2023-11-29 04:47:58 25 4
gpt4 key购买 nike

根据我刚刚解决的问题快速提出一个问题(更多的是出于好奇)(我将在帖子中发布问题的答案,可以在这里找到:My former question

问题是我有这个 UITableView 其中包含自定义单元格对象。每次您进入此 View 时,我都会为 UITableView 生成新单元格,如下所示:

    if (cell == nil)
{
[[NSBundle mainBundle] loadNibNamed:@"UploadCellView" owner:self options:nil];

cell = customCell;
}

这发生在标准方法中:

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

现在的问题是我的自定义单元格对象监听有关后台发生的上传对象的 NSNotifications,因此它们可以将其模型数据更新到其标签和进度条等。它是这样发生的(这是自定义的方法)单元格对象):

-(void) uploadProgress: (NSNotification*)notification
{
NSDictionary *userInfo = [notification userInfo];

NSNumber *uploadID = [userInfo valueForKey:@"uploadID"];

if (uploadID.integerValue == uploadActivity.uploadID)
{
UIProgressView *theProgressBar = (UIProgressView*)[self viewWithTag:progressBarTag];

[theProgressBar setProgress:(uploadActivity.percentageDone / 100) animated:YES];

UILabel *statusText = (UILabel*)[self viewWithTag:percentageTag];

[statusText setText:[NSString stringWithFormat:@"Uploader - %.f%% (%.01fMB ud af %.01fMB)", uploadActivity.percentageDone, uploadActivity.totalMBUploaded, uploadActivity.totalMBToUpload]];
}
}

上传完成后,他们只需执行以下操作:

-(void) uploadFinished: (NSNotification*)notification
{
NSDictionary *userInfo = [notification userInfo];

NSNumber *uploadID = [userInfo valueForKey:@"uploadID"];

if (uploadID.integerValue == uploadActivity.uploadID)
{
[self setUploadComplete];

[[ApplicationActivities getSharedActivities] markUploadAsFinished:uploadActivity];

NSLog(@"BEGINNING RELOAD");
[parentTable reloadData];
NSLog(@"ENDING RELOAD");
}
}

现在的问题是当他们调用自己的 TableView 时。当包含 tableview 的 View 关闭时,旧的自定义单元格对象仍然在后台事件并获取 NSNotfications。当上传完成后,以前的 TableView 中的旧自定义单元格对象仍然尝试调用当时设置的parentTable属性,现在导致调用随机垃圾内存。

我解决这个问题的方法是保留在表中创建的所有单元格对象的数组,然后让它们在 View 关闭时停止监听,如下所示:

-(void) viewWillDisappear:(BOOL)animated
{
for (UploadCell *aCell in lol)
{
[aCell stopListening];
}

[self.navigationController popViewControllerAnimated:YES];
}

但这看起来有点像黑客。我将如何确保在 View 关闭时删除自定义单元格对象?因为当 View 再次初始化时,无论如何都会创建新的单元格,所以我对旧的单元格没有用处。

自定义 View 单元格有一个强大的属性指针指向它们关联的 TableView ,但我认为 ARC 会确保 TableView 指针不会失效?显然是这样的。也许是因为包含 View 在弹出时被删除?

最佳答案

听起来单元格有一个保留属性指向您的 UITableViewDataSource 类。

它们应该有一个分配属性,然后当 TableView 被释放时它们将被正确释放(如果您的单元格保留它,目前则不能)。

此外,当单元格从表格 View 中删除时,应通过重写单元格 didMoveToSuperview 方法来关闭通知:

- (void)didMoveToSuperview
{
[super didMoveToSuperview];
if ( [self superview] == nil )
{
[self unsubscribeFromYourNotifications];
}
}

也就是说,如果他们滚出屏幕,他们就不会浪费资源来更新内容。

关于ios - 在 iOS 上使用 ARC 进行内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9338248/

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