-1

アニメーション ブロックを含むメソッドがあります。クラス プロパティを引数としてメソッドに渡し、ブロック内で nil の値を代入しようとしています。

-(void)endPinching:(UIViewController *)pinchedController{

    // a bunch of code

    [UIView animateWithDuration:0.2 animations:^{
        //do stuff

    } completion:^(BOOL finished) {

       // do other stuff

        pinchedController = nil; //HERE IS THE PROBLEM!!
    }];
  }
}

したがって、このメソッドが呼び出されたクラスでこのメソッドを呼び出すと、pinchController は self.pinchController であるため、ブロック内で nil に設定できます。しかし、ここでは、定義で、コンパイラ エラーが発生します。

"variable not assignable, missing block type specifier"

そこで、次のようにしてブロック指定子を追加してみました。

__block pinchedController = nil;

コンパイラは次のように述べています。

"unused variable pinchedViewController"

これは、pinchedController が新しい変数と見なされ、メソッド パラメーターに関連付けられていないことを意味すると思います。

私の質問は: pinchedViewController を引数として渡し、このブロック内で nil に割り当てる方法はありますか?

4

1 に答える 1

0

私があなたを正しく理解していれば、指定されたオブジェクトの割り当てを明示的に解除したいでしょう。これは、参照カウントがどのように機能するかという理由で不可能です。

UIViewControllertoを渡すことendPinching:で、オブジェクトの refcount を 1 増やします。ポインター (スタック上のローカル変数) を に設定するnilと、参照カウントが 1 だけ減少しますが、これはまだクラスのインスタンス変数であるため、割り当てが解除されることはありません。

そのため、まず、そのようなオブジェクトの割り当てを解除する理由を自問する必要があります。これは、コードをより適切に設計するか、View Controller が大量のメモリを占有する理由を解明することで解決できます。

それでも割り当てを解除したい場合self.pinchController = nilは、メソッドで明示的に設定するか、それを行うある種のデリゲートを呼び出すことができます (View Controller の設計全体をより具体的にする必要があります)。

于 2013-07-15T15:47:25.773 に答える