Objective-C属性的解释

时间:2012-02-21 05:02:58

标签: objective-c ios

我正在读一本关于iOS的书(它叫做iOS 4编程,由Matt Neuburg编写),在他解释属性的段落中他说了这些话:

  

Objective-C对属性使用点符号,C对结构使用点符号;这些可以链接。因此,例如,UIView的框架是一个属性,其值是一个结构(CGRect);因此,你可以说myView.frame.size.height,其中frame是一个返回结构的属性,size是该结构的一个组件,而height是该结构的一个组件。但是结构不是指针,所以你不能(例如)直接通过以UIView开头的链设置框架的高度,如下所示:

myView.frame.size.height = 36.0; // compile error
  

相反,如果您想要更改struct属性的组件,那么   必须将属性值提取到struct变量中,更改   struct variable的值,并从中设置整个属性值   struct variable:

CGRect f = myView.frame;
f.size.height = 0;
myView.frame = f;

我不太了解,为什么我不能使用下面这一行?

myView.frame.size.height = 36.0;

3 个答案:

答案 0 :(得分:3)

<强>背景

编程语言中的变量是,它具有名称(有时称为“引用”或“指针”,具体取决于语言)。包含某种类型的值。值不会改变,框的内容也会改变。例如,在下面的代码中:

int a = 4;
a = 5;

第二行不会更改4,它会更改框a中的内容。

编程语言中的类型分为两类:值类型引用类型

对于值类型,传递并存储在框中的是实际值的表示,例如,在代码中:

double a = 9.0;
double b = sqrt(a);

函数sqrt未传递a,而是存储在a中的 - 这是表示数字9.0的某个位序列; sqrt返回的是一些代表3.0的位序列,它们存储在b中。在你的一条评论中使用你的单词传递的位是“真正的价值”。

对于引用类型,传递并存储在框中的是包含实际值的框(内存块)名称的一些表示。在Objective-C中,通过在声明中使用*来区分引用类型(其他语言不需要*,例如Java&amp; C# - 它们根据类型知道哪些类型是引用类型) 。例如,代码:

NSWindow *main = [NSApp mainWindow];

方法调用不返回窗口值本身,而是返回包含窗口值的框的名称。再次使用你的单词,“真正的价值”永远不会传递,而是传递包含该值的框的名称。

传统的“小”类型由值类型表示 - 整数,浮点数,字符等;而引用类型的“大”值。但是,每种编程语言都有自己的选择 - 有些甚至被定义为仅使用引用类型。

<强>答案

在您的示例中,myView.frame是属性,属性是使用方法实现的。在Objective-C(和C,C ++)中,struct类型是类型 - 它被视为整数和浮点数,它的值被传递并存储在框中。所以该属性返回的是,使用你的文字,“真正的结构” - 它就像上面例子中代表3.0的位一样“真实”。

未返回的是包含结构值的框的名称,如果不访问框,则无法更改其内容。这就是myView.frame.size.height = 36.0;不正确的原因 - 您尝试更改值的一部分,并且值不会更改。

但是如果给出NSRect框,您可以更改其部分内容。例如。在代码中:

NSRect aRect;
aRect.size.height = 36.0;

.size.height标识要更改的框aRect的哪一部分,36.0的表示形式存储在框的该部分中。

HTH

答案 1 :(得分:2)

因为如果你把它全部打破了,myView.frame就像说

一样
CGRect aFrame = [myView frame]

它会返回结构的副本,而不是返回“真实”结构的指针。因此,编译器通过不让您在临时结构中设置一个不会反映在“真实”结构中的值来帮助您。

答案 2 :(得分:1)

myView.frame

将返回一个Rvalue而不是Lvalue的结构。对于rvalue and lvalue read this
现在myView.frame将返回rvalue,这是一个数据而不是指针。