我有一个数组,在页面加载时有200个对象我将这些(可变副本)复制到名为filteredarray的临时数组,然后我在uitableview中显示。这一切都很好:)
然后我有一个段选择器,当被选中时,应该使用predictate和filteredarray过滤我的原始数组,现在将再次满足预测标准的对象的内容,我可以看到它工作正常:)< / p>
然后我尝试重新加载我的表视图(再次使用filteredarray),当我单步执行似乎对filterarray中的前几个对象工作正常但是如果那是正确的单词,那么filteredarray似乎被“清空”,并且我的代码表开始刷新后崩溃。我确定它一定是内存问题。我对目标c很新,所以任何帮助都会非常感激。我在下面列出了一些代码
- (void)viewDidLoad
{
[super viewDidLoad];
appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
filteredArray = [appDelegate.originalArray mutableCopy];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellidentifier = @"customcell";
customcell *cell = (customcell *)[tableView dequeueReusableCellWithIdentifier:
cellidentifier];
array_details *arrayObj = [filteredArray objectAtIndex:indexPath.row];
// UITableViewCell cell needs creating for this UITableView row.
if (cell == nil)
{
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"customcell" owner:self options:nil];
for (id currentObject in topLevelObjects) {
if ([currentObject isKindOfClass:[customcell class]]) {
cell = (customcell *) currentObject;
break;
}
}
}
cell.line1.text = arrayObj.line1;
cell.line2.text = arrayObj.line2;
return cell;
}
-(IBAction)change_segment:(id)sender;{
if(segmentcontrol.selectedSegmentIndex == 2){
filteredArray = [appDelegate.originalArray mutableCopy];
NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"selected == YES"];
filteredArray = [filteredArray filteredArrayUsingPredicate:testForTrue];
}
[my_table reloadData]; // its when i do this that the array filtered array seems to somehow get "emptied"
并且我的filteredarray在my.h文件中声明为可移动数组
NSMutableArray *filteredArray;
答案 0 :(得分:1)
由于你有一个NSMutableArray,我建议使用filterUsingPredicate:
而不是filteredArrayUsingPredicate:
。您开始使用的已过滤数组是保留的,因为您是通过副本获得的,但是在change_segment:
方法中替换它的那个不是。
(我怀疑这是问题,但崩溃及其相关异常的详细信息会使诊断变得更容易。)
答案 1 :(得分:0)
保留你的阵列。在-dealloc中释放它。
filteredArray = [appDelegate.originalArray mutableCopy] retain];