在objective-c,内存分配中的结构

时间:2011-06-15 16:30:31

标签: iphone cgrect

对于noob问题很抱歉,但我开始在objective-c中使用结构体来表示CG数据类型。如果我创建一个新的CGRect,并将其设置为某个view.frame,它们现在指向内存中的相同内容吗?或者它们是两个独立的对象,如果我改变一个,我不会改变另一个? THX。

我正在创建一个CGRect并将其设置为我的view.frame。然后根据数据,我更新frame.size.height。但是,在我的else语句中,我想将它改回原来的大小,所以如果我选择一个不同的对象,那么它的帧很大。似乎一旦我将框架设置为更小的尺寸,它就会保持这个尺寸。

CGRect frameToCenter = self.SView.frame;
CGFloat originalHeight = self.SView.frame.size.height;
//CGFloat originalHeight = 500.0; //if I hardcode it works.

if ([self.array count] == 1) {
    frameToCenter.size.height = totalRowHeight;
}
else {
    frameToCenter.size.height = originalHeight;
}
self.SView.frame = frameToCenter;

我不想硬编码任何东西,但我希望得到基本的功能,所以我开始时我的数组中只有1。然后对于其他数字,视图将返回原始大小。但是一旦它击中了第一个if语句,就永远不会改变它的高度。我可以改变回来的唯一方法是在此块之前硬编码CGFloat值。

1 个答案:

答案 0 :(得分:1)

首先,CGRect根本不是对象。听起来你知道这一点,但问题“他们是两个独立的对象”暗示了这一点上的混乱。

由于您要分配实际的结构,而不是指向结构的指针,因此赋值会将值从原点复制到接收方。在分配之后,更改其中一个将对另一个没有影响,除非您执行另一个分配。所以这段代码不会改变视图的框架:

CGRect myRect = myView.frame;
myRect.origin.x += 10.0;

如果我想更改框架,我需要另一条线将更改后的值分配回视图的框架:

myView.frame = myRect;