2

私は 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];
}

しかし、これにより、プロパティ行が見つからないというエラーが発生します。どうすればこれに対処できますか。

もう 1 つの概念的な質問: 私の目標が、メソッドに渡された indexPath の値を変更することだけである場合、ポインターで渡すこともできませんか? ポインター渡しではなく、参照渡しを選択するのはなぜですか?

4

2 に答える 2

2

私の目標がindexPathメソッドに渡された値を変更することだけである場合、ポインターで渡すこともできませんか?

インデックス パスは可変ではないため、そうではありません。新しいインデックス パス オブジェクトを作成し、それを返す必要があります。

ポインター渡しではなく、参照渡しを選択するのはなぜですか?

ObjC でこれを行う唯一の本当の理由は、複数の戻り値を持つことです。この手法の最も頻繁な使用法は、オブジェクトまたは成功/失敗インジケーターを返し、必要に応じてエラー オブジェクトを設定できるメソッドを持つことです。

この場合、メソッドから取得したいオブジェクトが 2 つあります。これを行う 1 つの方法は、参照渡しのトリックを使用することです。現在のように 2 つのインデックス パスを渡す方が簡単になるかもしれませんが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];
}
于 2012-05-12T19:16:14.607 に答える
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渡されたポインターをチェックする必要があります。 true が必要な場合はpass-by-reference、objc++ とNSIndexPath *&.

于 2012-05-12T16:11:55.853 に答える