Objective-C ARC:如何转换(void *)YES作为参数传递



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

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 下)被允许执行诸如将retainrelease消息发送到id之类的事情,如果您将YES投射到 id,这将崩溃。

我建议只使用快速枚举:

for (UIView *view in allViews) {
    view.hidden = shouldHideViews;
}

最新更新