我熟悉__block语句,它使变量’可赋值’在一个Block中.
但我发现当使用一些在方法中使用块作为参数的Objective-C特性时,一些变量是可分配的,即使它们未使用此__block语句声明.
但我发现当使用一些在方法中使用块作为参数的Objective-C特性时,一些变量是可分配的,即使它们未使用此__block语句声明.
以下是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实例属性赋值?
我不是在处理一个Object并改变它,就像我的mString一样.
我希望’center’属性的行为类似于myInt,因为它是直接访问的C结构,而不是指向对象的指针.
我希望’backgroundColor’的行为类似于我的imString,因为它是一个指向一个新对象的对象的指针,不是吗?
我在文档中找不到令人满意的解释……如果有人能提供一个,或者说我一个人,我将不胜感激.
解决方法
这是分配和使用之间的区别.用法是方法调用.你完全被允许在一个实例上调用方法([mString appendString:@“Block”]; //工作)但是你不能在没有标记变量的情况下分配(imString = @“Imutable Hello Block”; //错误)告诉编译器它应该启用它.
这段代码:
self.animatedView.backgroundColor = [UIColor blueColor];
仍然不是一个真正的任务,它是一个’隐藏’方法调用.点符号永远不是一个赋值,它是方法调用的语法糖.它实际上转换为:
[[self animatedView] setBackgroundColor:[UIColor blueColor]];
分配给局部变量和对象内部变量的区别在于它们驻留在内存中的位置.基本上,它们的存在时间是否足够长.这是堆栈上和堆上的数据之间的区别.