iPhone块解释

时间:2011-02-28 20:14:49

标签: iphone

大家好 我想了解块是如何工作的。

[UIView animateWithDuration:1 animations:^{
 blueViewController.view.alpha = 0;
 yellowViewController.view.alpha = 0;
}];

我很想了解他们是如何实现这一目标的。正如我所看到的,将视图的alpha更新为0的块只能执行,这将导致即时更新而不是动画? 如果有人可以向我解释他们如何实现这个功能,它会正确地帮助我理解块是如何工作的。

我认为它有点奇怪,我所创建的闭包只会创建只读变量。我怎么能在不用“_ block”关键字定义alpha的情况下更改alpha?是缩放器类型只需要“ _block”吗? (int / float ect)。

4 个答案:

答案 0 :(得分:2)

魔术不是Block系统,它只是允许你创建和调用匿名函数。神奇的是核心动画框架。

基本是所有参数都会立即应用,但Core Animation不会立即重新绘制所有参数,而是在给定的动画持续时间内查找更改并应用它们。

查看Core Animation框架参考和WWDC 2010会话424和425以获取更深入的信息。

答案 1 :(得分:0)

块只是一种回调,可以传递给另一个作用域,同时仍然可以从定义它的作用域访问局部变量。 这叫做封闭。

你的问题似乎与CoreAnimation更相关......

答案 2 :(得分:0)

我认为其他答案涵盖了块本身与核心动画和动画块之间的区别(术语“块”的不同用法)。

但是关于捕获变量的问题,你得到的是指针'blueViewController'和'yellowViewController'的const副本。指针本身是const副本,但您使用这些指针访问底层视图控制器对象以检索每个视图,然后发送每个视图a - [UIView setAlpha:]消息。

如果你拼出来,可能会更清楚。在您的区块中,您有:

UIView *view = [blueViewController view]; // <-- send view message to the const pointer
[view setAlpha:0.0]; // <-- Now send a setAlpha message to the view

blueViewController.view.alpha = 0.0只是上述的缩写。

希望有所帮助。

答案 3 :(得分:0)

您可以从块中访问任何实例变量或全局变量。

[UIView animateWithDuration:1 animations:^{
 blueViewController.view.alpha = blueViewController.myAlphaValue;
 yellowViewController.view.alpha = 0;
}];

blueViewController和yellowViewController会自动从块中保留,因为它们是Objective-C对象,从块中访问是安全的,而不必担心实例的生命周期。如果blueViewController和yellowViewController是ivar,则块自动保留self。

__block存储类型修饰符也可以用于指针。

__block MyViewController *myViewController = self.viewController;

但是,即使此变量是Objective-C对象,也不会自动从块中保留此变量。注意__block Objective-C对象的生命周期。

^{
    myViewController = self.viewController;
    /* If myViewController is with __block modifier, it is ok. */
    /* If myViewController is without __block modifier, this line is not able to compile. */
};

The __block Storage Type