通过引用传递NSIndexPath

时间:2012-05-12 15:29:56

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

我正在使用ARC并希望创建一个通过引用传入indexPath的方法,以便我可以更改其值:

-(void)configureIndexPaths:(__bridge NSIndexPath**)indexPath anotherIndexPath:(__bridge NSIndexPath**)anotherIndexPath
{
      indexPath = [NSIndexPath indexPathForRow:*indexPath.row + 1 inSection:0];
      anotherIndexPath = [NSIndexPath indexPathForRow:*anotherIndexPath.row + 1 inSection:0];
}

但是这给了我一个找不到属性行的错误。我该如何解决这个问题。

另一个概念性问题:如果我的目标只是改变传入方法的indexPath的值,那么无法通过指针传递那个吗?为什么我会选择通过引用传递而不是通过指针传递?

2 个答案:

答案 0 :(得分:2)

  

如果我的目标只是改变传递给方法的indexPath的值,那么无法通过指针传递吗?

不是真的,因为索引路径不可变。您必须构造一个新的索引路径对象并返回它。

  

为什么我会选择通过引用传递而不是通过指针传递?

在ObjC中执行此操作的唯一真正原因是具有多个返回值。最常使用此技术的方法是使用返回对象或成功/失败指示符的方法,并在必要时也可以设置错误对象。

在这种情况下,您有两个想要从该方法中退出的对象;一种方法是使用pass-by-reference技巧。它可能会让您的生活更加简单,就像现在一样传递两个索引路径,但返回NSArray新的路径:

 - (NSArray *)configureIndexPaths:(NSIndexPath*)indexPath anotherIndexPath:( NSIndexPath*)anotherIndexPath
{
    NSIndexPath * newPath = [NSIndexPath indexPathForRow:[indexPath row]+1 inSection:0];
    NSIndexPath * anotherNewPath = [NSIndexPath indexPathForRow:[anotherIndexPath row]+1 inSection:0];
    return [NSArray arrayWithObjects:newPath, anotherNewPath, nil];
}

答案 1 :(得分:1)

这就是你要这样做的方式:

-(void) configureIndexPaths:(NSIndexPath*__autoreleasing *)indexPath anotherIndexPath:(__bridge NSIndexPath*__autoreleasing *)anotherIndexPath
{
    if (indexPath)
        *indexPath = [NSIndexPath indexPathForRow:[(*indexPath) row] + 1 inSection:0];
    if (anotherIndexPath)
        *anotherIndexPath = [NSIndexPath indexPathForRow:[(*indexPath) row] + 1 inSection:0];
}

您应该使用__autoreleasing,以便在创建对象时正确地自动释放它们,以及检查传入的NULL指针。如果您想要真正的pass-by-reference ,查看objc ++和NSIndexPath *&