-1

nilメソッドにパラメーターとして渡される ivar であるオブジェクトに割り当てたいのですが、このようなものです。

- (int)trashObjectPassedIn:(Banana* banana) {
    banana = nil;

    return 42;
}

もちろん、次のように呼び出すと、[self trashObjectPassedIn:oldBanana];oldBanana は変更されず、ローカル パラメータのみが割り当てられます。

nil元のオブジェクトに割り当てる方法はありますか?

4

3 に答える 3

2

別のアプローチを見つけることをお勧めします。TrashObjectPassedInにはバナナへの参照が渡されます。それをゼロにすることはできますが、実際のバナナには何も起こりません。

バナナを削除したい (そして ARC を使用している) 場合は、バナナを所有するプロパティまたはメンバー変数を nil にする必要があります。

于 2012-09-13T17:13:59.070 に答える
2

これは奇妙に思えますが、これを行う正当な理由がいくつか (多くはありませんが) あり、オブジェクト ポインターにポインターを渡すことでこれを行うことができます。これは参照渡しと呼ばれ、目的 c は通常、値渡しです。save:これは、Cocoa で NSErrorを受け入れる任意のメソッドで使用されていることがわかりますNSManagedObjectContextこの回答には、より詳細な説明があります

メソッド宣言を次のように変更します

- (int)trashObjectPassedIn:(Banana **)banana

呼び出して値を渡します

int result = [self trashObjectPassedIn:&banana];

メソッド内で値を設定できます。

*banana = nil;
于 2012-09-13T18:23:26.730 に答える
2

ARC を使用していて、インスタンス変数がstrong参照であると仮定すると、次のようにします。

- (int)trashObjectPassedIn:(Banana *__strong *)banana) 
{
    *banana = nil;
    return 42;
}

これにより、オブジェクトが漏れるのを防ぎます。これは参照では機能しないことに注意してweakください。ARC を使用していない場合、ARC を一般的かつ安全に機能させるのは非常に難しいと思います。

編集:それを呼び出す方法を示すのを忘れました:インスタンス変数は[self trashObjectPassedIn:&_myBanana]どこにありますか。_myBanana

于 2012-09-13T20:56:37.667 に答える