UIView如何保护frame属性成员?
How does UIView protect the frame property members?
我很好奇 UIView 是如何将其 .frame 属性 成员设置为只读的。
显然,如果我为自己声明并初始化一个 CGRect,我可以使用点符号来修改结构的成员。
但是,如果我尝试使用 UIView 的框架执行此操作,则它不起作用。
私有实现会是什么样子?
来自文档:
If you don’t want to allow a property to be changed via a setter method, you can add an attribute to a property declaration to specify that it should be readonly:
@property (readonly) UIView *testView;
testView.frame.origin.x=100; //expresison not assignable
testView.frame.size.height=100; //expression not assignable
由于框架是一个结构体 (CGRect),它是按值传递的,而不是按引用传递的。因此,编译器不会让您对永远无法引用的值的副本进行赋值。
如果您将 CGRect 作为 属性 添加到您的 class,它的行为方式相同,不需要特殊的 Apple-secret-sauce。
如果您先将框架分配给局部 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!
因为如果不先将其分配到某处,就无法更改成员字段。那是因为如果你不分配它,编译器只会让你编辑一个 "temporary" 结构的副本,它会立即消失。因为这对任何事情都没有影响,所以不允许这样做,防止你不小心认为它会做一些有用的事情。
这里可能令人困惑的是用于访问视图 (.
) 上的 属性 的表示法,它与用于访问结构成员的表示法相同,但是那些实际上在做不同的事情; view.frame
中的点是 [view frame]
的语义等价物,它是框架 属性 的访问器,即 returns 一个 copy 一个矩形结构体。 (无法从视图对象外部直接操作视图对象内部的框架版本。)
我很好奇 UIView 是如何将其 .frame 属性 成员设置为只读的。 显然,如果我为自己声明并初始化一个 CGRect,我可以使用点符号来修改结构的成员。
但是,如果我尝试使用 UIView 的框架执行此操作,则它不起作用。 私有实现会是什么样子?
来自文档:
If you don’t want to allow a property to be changed via a setter method, you can add an attribute to a property declaration to specify that it should be readonly:
@property (readonly) UIView *testView;
testView.frame.origin.x=100; //expresison not assignable
testView.frame.size.height=100; //expression not assignable
由于框架是一个结构体 (CGRect),它是按值传递的,而不是按引用传递的。因此,编译器不会让您对永远无法引用的值的副本进行赋值。
如果您将 CGRect 作为 属性 添加到您的 class,它的行为方式相同,不需要特殊的 Apple-secret-sauce。
如果您先将框架分配给局部 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!
因为如果不先将其分配到某处,就无法更改成员字段。那是因为如果你不分配它,编译器只会让你编辑一个 "temporary" 结构的副本,它会立即消失。因为这对任何事情都没有影响,所以不允许这样做,防止你不小心认为它会做一些有用的事情。
这里可能令人困惑的是用于访问视图 (.
) 上的 属性 的表示法,它与用于访问结构成员的表示法相同,但是那些实际上在做不同的事情; view.frame
中的点是 [view frame]
的语义等价物,它是框架 属性 的访问器,即 returns 一个 copy 一个矩形结构体。 (无法从视图对象外部直接操作视图对象内部的框架版本。)