我熟悉使用__block
语句可以在Block内使变量“可分配”。
但是当使用一些将Blocks作为方法参数的Objective-C特性时,即使没有使用__block
语句声明,某些变量也是可分配的。
以下是两个示例代码:
[UIView animateWithDuration:2 animations:^
{
self.animatedView.backgroundColor = [UIColor blueColor];
self.animatedView.center = CGPointMake(100, 100);
}];
(animatedView是一个简单的UIView,连接了IBOutlet。)
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。
我期望 'center' 属性的行为像我的myInt,因为它是直接访问的C结构体,而不是对象的指针。
我期望 'backgroundColor' 的行为像我的imString,因为它是一个指向对象的指针,并被分配了一个新对象,不是吗?
我在文档中找不到满意的解释...如果有人能提供一个解释或指导我去找一个,我会很感激。