我有一个视图数组,我需要将它们全部隐藏起来,所以我使用:
BOOL shouldHideViews = YES;
[allViews makeObjectPerformSelector:@selector(setHidden:) withObject:(void *)shouldHideViews]
当我将代码转换为 ARC 时,它告诉我我需要一些桥接转换,然后我更改了:
(void *)shouldHideViews
自
(__bridge BOOL)shouldHideViews
它说不兼容的类型将"int"转换为"BOOL",并带有__bridge转换
那我该怎么做呢?我知道我可以迭代数组中的所有视图,但这不是重点,我想知道我应该怎么做才能使这个 ARC 兼容。
谢谢!
其他表明你不能以这种方式通过YES
答案是正确的。但是,有更简单的解决方案:
[allViews setValue:[NSNumber numberWithBool: shouldHideViews] forKey:@"hidden"];
这是有效的,因为NSArray覆盖了其setValue:forKey:
用于此用途。
您现在还可以使用块:
[allViews enumerateObjectsUsingBlock:
^(id obj, NSUInteger idx, BOOL *stop){ [obj setHidden:shouldHideViews];}];
或者久经考验的for()
循环(参见@rob Mayoff的答案。
其中,我通常只使用for
循环。
将基元类型作为空指针传递。您应该将布尔变量保留为实例变量,并在 setHidden 中引用它。这样你就可以这样做:
shouldHideViews = YES; //declare BOOL shouldHideViews; in your .h file
[allViews makeObjectPerformSelector:@selector(setHidden) withObject:nil];
这些对你相当有帮助
如何在 Cocoa 中使用 performSelector:withObject:afterDelay: with primitive type?.
使用 performSelector:withObject:afterDelay: 与非对象参数
SEL 执行选择器和参数
您应该使用 NSNumber
制作包装器或使用 NSInvocation
.
makeObjectsPerformSelector:withObject:
的object
参数是 id
类型。 这意味着它需要指向一个Objective-C对象。 将非对象投射到id
是一个坏主意,因为系统(特别是在 ARC 下)被允许执行诸如将retain
和release
消息发送到id
之类的事情,如果您将YES
投射到 id
,这将崩溃。
我建议只使用快速枚举:
for (UIView *view in allViews) {
view.hidden = shouldHideViews;
}