1

我有一组视图,我需要将它们全部隐藏,所以我使用:

BOOL shouldHideViews = YES;
[allViews makeObjectPerformSelector:@selector(setHidden:) withObject:(void *)shouldHideViews]

当我将代码转换为 ARC 时,它告诉我需要一些桥接演员,然后我进行了更改:

(void *)shouldHideViews

(__bridge BOOL)shouldHideViews

它说不兼容的类型使用 __bridge 转换将“int”转换为“BOOL”

那么我该怎么做呢?我知道我可以迭代数组中的所有视图,但这不是重点,我一般想知道我应该怎么做才能使这个 ARC 兼容。

谢谢!

4

4 回答 4

1

您不能将原始类型作为 void 指针传递。您应该将布尔变量保留为实例变量并在 setHidden 中引用它。这样你就可以这样做:

shouldHideViews = YES; //declare BOOL shouldHideViews; in your .h file
[allViews makeObjectPerformSelector:@selector(setHidden) withObject:nil];
于 2012-06-28T04:04:01.027 回答
1

这些对你很有帮助

如何在 Cocoa 中将 performSelector:withObject:afterDelay: 与原始类型一起使用?

使用 performSelector:withObject:afterDelay: 与非对象参数

SEL performSelector 和参数

您应该使用NSNumber或使用NSInvocation.

于 2012-06-28T04:08:58.137 回答
1

object参数makeObjectsPerformSelector:withObject:是类型id。这意味着它需要指向一个 Objective-C 对象。将非对象投射到 anid是一个坏主意,因为系统(特别是在 ARC 下)被允许执行诸如将retainandrelease消息发送到 an之类的事情id,如果你投射YESid.

我建议只使用快速枚举:

for (UIView *view in allViews) {
    view.hidden = shouldHideViews;
}
于 2012-06-28T04:12:02.657 回答
1

其他表明您无法通过YES这种方式的答案是正确的。然而,有更简单的解决方案:

[allViews setValue:[NSNumber numberWithBool: shouldHideViews] forKey:@"hidden"];

这是有效的,因为 NSArraysetValue:forKey:正是为了这种用途而覆盖了它。

您现在还可以使用块:

[allViews enumerateObjectsUsingBlock:
  ^(id obj, NSUInteger idx, BOOL *stop){ [obj setHidden:shouldHideViews];}];

或久经考验的真实for()循环(请参阅@rob mayoff 的回答。)

其中,我通常只使用for循环。

于 2012-06-28T04:14:46.710 回答