0

在我的应用程序中,我启用了 ARC,并且对它也很陌生。由于对启用 ARC 的代码的缺乏经验处理,我遇到了一些麻烦

我有一个名为datatype的强属性和一个相同类型 NSMutableArray的弱实例变量_currentData

我使用_currentData在应用程序中加载 tableView。我要显示的主要集合始终是data可变的。我将变量指向的 MutableArray 指向data变量_currentData,下面是我的 ViewDidLoad

-(void)ViewDidLoad
{
    data=[[NSMutableArray alloc]init];

    //load the data 

    _currentData=data; 
    [myTableView reloadData];

}

我的数据源方法如下

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
     return [_currentData count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     id var=[_currentData objectAtInsex:indexPath.row];
     //.....my drawing methods on the cell View 
     return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    id var=[_currentData objectAtInsex:indexPath.row];
    NSlog(@"var %@",var);
}

上面的代码工作正常,每次我点击单元格时都会打印出 var,直到我计划像下面的代码那样实现搜索栏

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{

    _currentData =[data filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"name contains[c] '%@'",searchText]]];//  Object with attribute name
    [myTableView reloadData];
}

上面的代码可以正常工作,直到在 tableView 中显示过滤后的结果,但是当我点击任何行时,我得到了空打印

我不知道哪里出错了。

4

2 回答 2

1

currentData当它只是指向时,弱化就可以了data。只要在data身边,currentData就会一直存在,data离去时也会如此currentData

您的问题是您分配currentData了一个新值:

_currentData =[data filterUsingPredicate:myPredicateVariable];

或者如果filterUsingPredicate:返回一个值(我认为你的意思是)filteredArrayUsingPredicate:,它只会在方法结束之前的范围内。到时候reloadData被叫,currentData已经被释放了。您要么需要分配[data filteredArrayUsingPredicate:myPredicateVariable];给强属性或 ivar,要么声明currentData为强。

于 2013-03-30T12:30:53.950 回答
1
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText  {   
    _currentData =[data filterUsingPredicate:myPredicateVariable];
    [myTableView reloadData];
}

there is fault logic here. You filter array (in-place) as you modify the mutable array. What you want is to get a NEW filtered array else this works only once/rarely

so

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText  {   
    NSMutableArray *newData = [data filteredArrayUsingPredicate:myPredicateVariable];
    _currentData = newData;
    [myTableView reloadData];
}

THEN _currentData most be strong because nobody else is retaining the new array. If it were __weak, it would turn to nil as soon as newData is released

于 2013-03-30T13:23:32.633 回答