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

Ios UIView如何保护框架属性成员?,ios,objective-c,uiview,Ios,Objective C,Uiview,我很好奇UIView是如何将其.frame属性成员设置为只读的。 显然,如果我为自己声明并初始化一个CGRect,我可以使用点符号来修改结构的成员 但如果我尝试用UIView的框架来实现这一点,它就不起作用了。 私有实现是什么样子的?来自文档: 如果不希望通过setter方法更改属性,可以将属性添加到属性声明中,以指定属性应为只读: 从文件中: 如果不希望通过setter方法更改属性,可以将属性添加到属性声明中,以指定属性应为只读: 因为框架是一个结构(CGRect),所以它是通过值传递的,而不

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

但如果我尝试用UIView的框架来实现这一点,它就不起作用了。
私有实现是什么样子的?

来自文档:

如果不希望通过setter方法更改属性,可以将属性添加到属性声明中,以指定属性应为只读:


从文件中:

如果不希望通过setter方法更改属性,可以将属性添加到属性声明中,以指定属性应为只读:


因为框架是一个结构(CGRect),所以它是通过值传递的,而不是引用。因此,编译器不允许您对无法引用的值的副本进行赋值


如果将CGRect作为属性添加到类中,它的行为将与此相同,不需要特殊的Apple秘方。

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


如果将CGRect作为属性添加到类中,它将以相同的方式运行,不需要特殊的Apple secret Saint。

如果首先将框架指定给局部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结构的副本。(无法从视图对象外部直接对视图对象内部的帧版本进行操作。)

如果首先将帧指定给局部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结构的副本。(无法从视图对象外部直接对视图对象内部的框架版本进行操作。)

这可能会对您有所帮助:您的意思是,如果将uiview属性设置为只读,则无法更改uiview的属性?我明白你的意思了吗@Earl GreyThis可能会帮助您:您的意思是,如果您将uiview属性设置为只读,那么您就无法更改uiview的属性了吗?我明白你的意思了吗@我说的是厄尔·格雷伊,框架财产成员。不是.frame属性本身。Frame是一个结构,其中两个结构都有两个CGfloat。不可行的是那些成员。我说的是。框架属性成员。不是.frame属性本身。Frame是一个结构,其中两个结构都有两个CGfloat。不可行的是那些成员。