在我的应用程序中,我启用了ARC,也是新手。由于没有经验的ARC启用代码处理
,我遇到了一些麻烦我有一个名为data
的强大属性NSMutableArray
和一个相同类型的弱实例变量_currentData
我使用_currentData
在应用程序中加载tableView。我想要显示的主要集合始终位于data
变量中。我将data
变量指向的MutableArray指向_currentData
变量,下面是我的ViewDidLoad
-(void)ViewDidLoad
{
data=[[NSMutableArray alloc]init];
//load the data
_currentData=data;
[myTableView reloadData];
}
我的dataSource方法如下所示
- (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中显示过滤结果但是当我点击任何一行时我打印出来
我不知道它出了什么问题。
答案 0 :(得分:1)
当currentData
只是指向data
时,它会变弱。只要data
在,currentData
将被保留,当data
消失时,currentData
也会消失。
您的问题是您将currentData
分配给新值:
_currentData =[data filterUsingPredicate:myPredicateVariable];
如果filterUsingPredicate:
返回一个值(我认为你的意思是filteredArrayUsingPredicate:
),那么或就会,这只会在方法结束之前在范围内。到reloadData
被调用时,currentData
已被释放。您需要将[data filteredArrayUsingPredicate:myPredicateVariable];
分配给强大的属性或ivar,或将currentData
声明为强大。
答案 1 :(得分:1)
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
_currentData =[data filterUsingPredicate:myPredicateVariable];
[myTableView reloadData];
}
这里有错误逻辑。在修改可变数组时过滤数组(就地)。 你想要的是获得一个新的过滤数组其他只能运行一次/很少
所以
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
NSMutableArray *newData = [data filteredArrayUsingPredicate:myPredicateVariable];
_currentData = newData;
[myTableView reloadData];
}
然后 _currentData最强大因为没有其他人保留新阵列。如果它是__weak,那么一旦newData被释放就会变为nil