【发布时间】:2015-08-30 04:37:26
【问题描述】:
根据我刚刚解决的问题提出一个快速的问题(更多的是好奇心)(我将在帖子中发布我的问题的答案,可以在这里找到:My former question
问题是我有这个 UITableView 包含自定义单元格对象。每次进入此视图时,我都会为 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 的视图消失时,旧的自定义单元格对象在后台仍然存在,并获得 NSNotfications。当上传完成后,旧表格视图中的旧自定义单元格对象仍会尝试调用当时设置的 parentTable 属性,现在导致调用随机垃圾内存。
我解决这个问题的方法是在表格中创建一个包含所有单元格对象的数组,然后让它们在视图被关闭时停止侦听,如下所示:
-(void) viewWillDisappear:(BOOL)animated
{
for (UploadCell *aCell in lol)
{
[aCell stopListening];
}
[self.navigationController popViewControllerAnimated:YES];
}
但这似乎有点像 hack。当视图被关闭时,我将如何确保自定义单元格对象被删除?因为当视图再次初始化时,无论如何都会简单地创建新单元格,所以我对旧单元格没有用处。
自定义视图单元格具有指向与之关联的 tableview 的强属性指针,但我认为 ARC 会确保 TableView 指针不会失效?显然它是某种方式。可能是因为弹出时包含的视图被删除了?
【问题讨论】:
标签: ios pointers automatic-ref-counting instances