将参数传递给包含块和赋值的方法

时间:2013-07-15 15:04:25

标签: ios objective-c objective-c-blocks

我有包含动画块的方法。我试图将一个类属性作为参数传递给该方法,并在块内为其赋值为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?

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望显式释放给定对象。由于引用计数的工作原理,这是不可能的。

通过将UIViewController传递给endPinching:,您将对象的引用量增加一。将指针(在堆栈上的局部变量)设置为nil只会将引用计数减少1,但由于这仍然是类的实例变量,因此不会取消分配。

首先,你应该问问自己为什么要释放这样的对象。这可以通过更好地设计代码或试图找出视图控制器占用大量内存的原因来解决。

如果您仍想要解除分配,可以在方法中明确设置self.pinchController = nil或调用某种代表(我需要看到整个视图控制器设计更具体)。