为什么“expression式不能赋值”(UIView.frame.origin)?

这个问题不是一个“我该怎么做”,而是一个“为什么是这个”,关于Objective-C中的一些类属性。

我明白,下面的两个例子是不允许的,并导致错误(“expression式不能分配”):

self.myUIView.frame.origin.x = 50; self.myUIView.frame.origin = CGPointMake(50,50); 

而正确的方法是创build一个新的CGRect,设置所需的值然后赋值:

 CGRect rect = self.myUIView.frame; rect.origin = CGPointMake(50, 50); self.myUIView.frame = rect; 

我想明白这是为什么。

CGRect是一个包含两个结构的结构。 限制与结构如何分配有关,是为了防止可能溢出内存的分配? 还是更多的是关于公共和私有财产的公约?

我意识到这似乎是一个小问题/基本问题,但我认为清楚这些基本types的事情的泥泞/坏理解是重要的。

这是因为如果你能够直接改变一个框架的原点或大小,你可以绕过UIView框架属性的setter方法。 这会因为多种原因而不好。

UIView将没有机会被通知有关框架的变化。 但它必须知道这些更改才能更新其子视图或重绘本身。

而且,为了KVO的工作,你必须使用正确的setter(通过使用setFrame:或点符号)。

分配struct元素的问题是,拥有该struct的类将不知道struct已被更改。 当你谈论一个框架的起源时,这是不好的: UIView应该改变原点,但是由于这个类不会被通知这个改变,所以不会发生移动。

另一方面,设置frame可以被检测,因为UIViewsetFrame方法将被调用。 这是UIView可以负责resize,重新定位等等的代码。