我熟悉__block
语句,它使块中的变量'可分配'。 但是我看到,当使用一些Objective-C功能使用块作为方法中的参数时,即使它们没有用此__block
语句声明,也可以分配一些变量。iOS >>块>>更改块外部变量的值
下面是实施例2级的代码:
[UIView animateWithDuration:2 animations:^
{
self.animatedView.backgroundColor = [UIColor blueColor];
self.animatedView.center = CGPointMake(100, 100);
}];
(animatedView是一个IBOutlet连接的简单的UIView)。
int myInt = 10;
NSMutableString* mString = [NSMutableString stringWithString:@"Mutable Hello"];
NSString* imString = @"Imutable Hello";
void (^myBlock)(void) =^
{
[mString appendString:@" Block"]; //working
imString = @"Imutable Hello Block"; //error
myInt = 11; //error
};
我的问题是:为什么我可以将值分配给UIView的实例属性?
我没有解决一个对象并改变它,就像我的mString。
我期望'中心'属性的行为就像我的myInt一样,因为它是直接访问的C结构,而不是指向对象的指针。
我期望'backgroundColor'的行为就像我的imString一样,因为它是一个指向一个新对象的对象的指针,不是吗?
我无法在文档中找到令人满意的解释......如果有人能提供一个,或者将我定位到一个,我将不胜感激。
让“BOOL隐藏”的事实或“CGPoint中心”追究他们背后的ivars不会有什么区别?这是否意味着它们是属性(通过Setter方法访问)会改变它们在内存中的分配方式?我也尝试过在我的课堂上声明的伊娃(而不是方法中的局部变量),它也起作用 - 而且它没有通过任何方法。 –
该方法是一个副作用(为了更好的术语)。区别在于内存位置。局部变量在堆栈上创建,所以除非您告诉编译器将它们复制到堆中,否则它们不可访问。编译器在块内部提供数据时也使用了一些'技巧'(并且所采用的路由在指针和原语之间是不同的)。这是一个深入的主题,请阅读此主题:http://stackoverflow.com/questions/15082265/why-is-a-block-variable-is-moved-to-the-heap-before-the-块被复制 – Wain
明白了。 Wain,你是男人!谢谢。 –