如何处理弱而强的指针?

时间:2013-03-30 05:57:08

标签: ios objective-c automatic-ref-counting

在我的应用程序中,我启用了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中显示过滤结果但是当我点击任何一行时我打印出来

我不知道它出了什么问题。

2 个答案:

答案 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