【问题标题】:Objective-C - Read-only variable is not assignable?Objective-C - 只读变量不可分配?
【发布时间】:2012-04-06 02:31:23
【问题描述】:

我一直在使用以下代码来移动视图,但从未遇到过问题。 我第一次在我的项目中开始使用 ARC,我在第二行收到以下错误。 "只读变量不可赋值"

我想用 ARC 做不同的事情吗?

CGRect rect = self.frame;

[UIView animateWithDuration:0.4 animations:^{
    rect.origin.x = 57;
    self.frame = rect;
}];

【问题讨论】:

  • 代码完全合法。您不应该遇到该错误。您是否遗漏了其他可能导致此问题的内容?
  • 好问题和好答案。谢谢!

标签: objective-c ios automatic-ref-counting


【解决方案1】:

问题是我在动画块中使用了 CGRect。 用 __block 标记变量解决了我的问题

__block CGRect rect = self.frame;

【讨论】:

  • 您也可以将 CGRect 变量放在块本身中,因为您只使用它来修改 self 的框架。这将使代码更易于阅读。
  • 取决于....如果 self 的帧在动画开始后 发生变化,那么执行@ikuragames 建议的操作会改变代码的行为。 araxt 所暗示的行为与 OP 一开始写的完全相同。
  • 我没有将它放在块中,因为它也在我的块之外使用
  • @bbum 你必须记住动画直到运行循环的下一次迭代才会发生。此外,OP 已经将 self.frame 复制到本地 CGRect 中,因此修改 self.frame 不会影响动画块的含义。
  • @aryaxt - 这很公平,在这种情况下,__block 修饰符可以满足您的需要。我的观点更笼统——代码的可读性很重要。通过将 rect 设置为块变量,不清楚原始分配何时实际发生。在你调用 animateWithDuration 之后,你期望 rect 是什么? UIView 不会对其进行动画处理,因为 UIView 对您的矩形一无所知。那么分配发生了,还是在动画完成之后发生,或者是下一个运行循环的开始?所以实际行为和你想要的行为都不清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
相关资源
最近更新 更多