UIView如何保护框架属性成员?

时间:2015-03-04 00:35:31

标签: ios objective-c uiview

我很好奇UIView如何将其.frame属性成员设为只读。 显然,如果我为自己声明并初始化CGRect,我可以使用点符号来修改结构的成员。

但是如果我尝试用UIView的框架来做这件事,它就不起作用了。 私有实现怎么样?

3 个答案:

答案 0 :(得分:2)

由于框架是结构(CGRect),因此它是通过值传递的,而不是引用。因此,编译器不允许您对永远不能引用的值的副本进行赋值。

如果您将CGRect作为属性添加到您的班级,它的行为方式将相同,不需要特殊的Apple秘密酱。

答案 1 :(得分:2)

如果您首先将帧分配给本地rect变量,您将发现可以更改该局部变量。

CGRect frame = view.frame;
frame.origin.x = 0;  // this appears to work

但是该框架现在是本地副本,而不是视图的实际框架,您需要将其设置回来:

view.frame = frame; // set the updated struct.

你不能像这样一步完成:

view.frame.origin.x = 0; // nope!

因为您无法在不先将其分配的情况下更改成员字段。那是因为如果你不分配它,编译器只会让你编辑一个立即消失的结构的“临时”副本。因为这对任何事都没有影响,所以不允许这样做,这会阻止你意外地认为它会做一些有用的事情。


这里可能令人困惑的是用于访问视图(.)上的属性的符号,这与用于访问结构成员的符号相同,但实际上这些符号有所不同事情; view.frame中的点是[view frame]的语义等价物,它是frame属性的访问器,返回rect结构的副本。 (无法直接在视图对象外部对视图对象内部框架的版本进行操作。)

答案 2 :(得分:0)

来自文档:

  

如果您不想通过setter方法更改属性,可以向属性声明添加一个属性,以指定它应该只读:

@property (readonly) UIView *testView;

testView.frame.origin.x=100;  //expresison not assignable
testView.frame.size.height=100;   //expression not assignable