在Obj-C中,多重赋值是一种hack吗?

5

所以,我有一个类(IKImageView)有很多属性。

我知道view setProp: BOOL返回void。然而:

BOOL b = view.prop = NO;

看起来是有效的。如果我有一个返回布尔值的函数f(),请问这个代码是否真正起作用:

[view setProp:f()];
Bool b = [view getProp];

或者

[view setProp: f()];
Bool b = f();

或者

BOOL TMP = f();
[view setProp: TMP];
BOOL b = TMP;

I ask because when I do:

BOOL b = view.hasHorizontalScroller = YES;
NSLog(@"b is %d scroll is %d", b, [view getHasHorizontalScroller]);

我得到的是“b is 1,scroll为0”(这意味着由于某种原因setHasHorizontalScroller失败了,但b设置正确)

但是:

BOOL b;
[view setHasHorizontalScroller: YES];
b = [view getHasHorizontalScroller];
NSLog(@"b is %d scroll is %d", b, [view getHasHorizontalScroller]);

我收到了“b是0,scroll是0”的信息。

这对我来说非常令人困惑。(此外,如果有人能告诉我如何设置属性为YES失败,但然后它成功地设置了b...而且没有错误出现...


1
请提交一个Bug报告。提供一个最小化的例子将非常有帮助。http://bugreport.apple.com/ - bbum
这是一个最简单的例子...我在系统附带的IKImageViewDemo中添加了代码...我刚刚提交了一个bug,感谢您的建议。 - Brian Postow
2个回答

5

它正在执行

BOOL TMP = f();
[view setProp: TMP];
BOOL b = TMP;

在属性发布之前就已经有人讨论过这个问题。一些人认为这应该是一个编译错误,以避免歧义。

最好完全避免使用这种结构。


好的,至少这解释了发生了什么,尽管不知道为什么setter失败...谢谢。 - Brian Postow

0

看起来不像是一个bug。以下是代码:

a.text = b.text = c.text;

生成这些方法调用:

// [c text]
// [b setText:]
// [a setText:]

正如您所看到的,[b text]在此链中未被调用 :(


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接