我正在使用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的值,那么无法通过指针传递那个吗?为什么我会选择通过引用传递而不是通过指针传递?
答案 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 *&
。