两行代码说的是同一件事?

Two lines of code that are saying the same thing?

我在一本书中进行了这个练习,并且在某一时刻,有一个方法的实现可以创建随机放置在视图中的标签。这是代码:

 1   - (void)drawHypnoticMessage:(NSString *)message{
 2       for(int i =0; i<20; i++){
 3           UILabel *messageLabel = [[UILabel alloc] init];

 4           messageLabel.backgroundColor = [UIColor clearColor];
 5           messageLabel.textColor = [UIColor whiteColor];
 6           messageLabel.text = message;
 7           [messageLabel sizeToFit];

 8           int width = self.view.bounds.size.width - messageLabel.bounds.size.width;
 9           int randomX = arc4random() % width;
 10          int height = self.view.bounds.size.height - messageLabel.bounds.size.height;
 11          int randomY = arc4random() % height;

 12          CGRect frame = messageLabel.frame;
 13          frame.origin = CGPointMake(randomX, randomY);
 14          messageLabel.frame = frame;

 15         [self.view addSubview:messageLabel];
 16      }
 17  }

这很好用。我的问题是关于第 12 行和第 14 行。当我将此练习从书中复制到 Xcode 并到达第 12 行时,我本能地将其更改为:

12   CGRect frame;

这没有用,我不明白为什么。对我来说,第 12 和 14 行:

12   CGRect frame = messageLabel.frame;

14   messageLabel.frame = frame;

肯定是在说同样的话两次。谁能解释一下为什么不是这样?

您正在修改第 13 行中的框架,即更改原点值。这本书向您展示了一种更改框架的常用技术,因为您无法自行更改磅值或大小值。

Objective-C 重载 C 的结构成员访问运算符 (.) 以访问 Objective-C 对象的属性。问题是你不能在一个赋值语句中混合这两者,因为编译器的解析器会混淆。

messageLabel 是一个对象,它有一个名为 frame 的 属性。 frame 是一个有两个成员的结构:originsize

为了绕过这个限制,你需要使用一个临时变量来保存结构(例如frame),操作这个副本(结构在分配时被复制),然后分配新的结构(frame) 到 属性,更新 属性 的值。