我对tableview及其数据有一个奇怪的问题。我有一个很长的,大约253个国家/地区的对象列表(NSManagedObjects)作为填充表格的数据源。
VC上的属性被定义为强属性:
@property (nonatomic, strong) NSArray *originalCountries;
@property (nonatomic, strong) NSArray *countries;
我有一些过滤逻辑,这就是拥有这两个数组的原因。
这真的很奇怪但是对于调试器来说,用作数据源的countries数组有253个对象(类型为Country),但是对象的属性都是nil,为此表变为“空”。
我的直觉说,一段时间后,“垃圾收集器”正在释放这些物品,但我不确定。我很好奇,阵列上的每个桶都指向一个Country对象,而不是直接为nil。这对你好奇吗?问题是,要选择(或不选择)大量国家/地区,用户需要一些时间来完成此操作,我丢失了表格数据。
我正在使用魔法记录来检索对象:
self.countries = [Country MR_findAllSortedBy:@"name" ascending:YES];
self.originalCountries = [Country MR_findAllSortedBy:@"name" ascending:YES];
如果我将原始国家作为国家的可变副本,获得释放对象所花费的时间甚至更低。 :(
鉴于此,问题是: - 您如何看待这种情况?我已经搜索了很多类似的问题,但我没有找到任何东西。 - 有没有办法对“垃圾收集器”说不要太快释放这个对象? - 也许我在表视图的实现上遗漏了一些东西?我可以分享一些额外的代码,以补充最后一个问题。
非常感谢你阅读这篇文章。任何形式的帮助都非常感谢。祝所有人新年快乐。
编辑1(更多与UITableView委托和数据源相关的代码):
#pragma mark UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.countries.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NextTripsCountriesListTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier forIndexPath:indexPath];
cell.arrowImageView.hidden = YES;
Country *c = [self.countries objectAtIndex:indexPath.row];
cell.countryLabel.text = [c.name uppercaseString];
cell.flagImageView.image = [UIImage imageWithData:c.flag];
cell.numberOfDestinationsLabel.hidden = YES;
if ([self.selectedCountries containsObject:c]) {
cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"check"]];
cell.accessoryView.tintColor = [UIColor colorWithHexString:@"#f95a30"];
} else {
cell.accessoryView = nil;
}
return cell;
}
#pragma mark UITableViewDelegate
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
// Remove seperator inset
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
// Prevent the cell from inheriting the Table View's margin settings
if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
[cell setPreservesSuperviewLayoutMargins:NO];
}
// Explictly set your cell's layout margins
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
return cell.bounds.size.height;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
Country *c = [self.countries objectAtIndex:indexPath.row];
if (self.configureForSingleSelection) {
cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"check"]];
cell.accessoryView.tintColor = [UIColor colorWithHexString:@"#f95a30"];
[self.selectedCountries addObject:c];
self.doneActionBlock(self.selectedCountries);
[self.popupController dismiss];
}
else {
if ([self.selectedCountries containsObject:c]) {
[self.selectedCountries removeObject:c];
cell.accessoryView = nil;
} else {
cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"check"]];
cell.accessoryView.tintColor = [UIColor colorWithHexString:@"#f95a30"];
[self.selectedCountries addObject:c];
}
}
}