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

Objective-C ARC:如何转换(void*)作为参数传递的YES?,objective-c,automatic-ref-counting,selector,Objective C,Automatic Ref Counting,Selector,我有一组视图,需要将它们全部隐藏,因此我使用: BOOL shouldHideViews = YES; [allViews makeObjectPerformSelector:@selector(setHidden:) withObject:(void *)shouldHideViews] 当我将代码转换为ARC时,它告诉我需要一些桥接转换,然后我更改了: (void *)shouldHideViews 到 它说不兼容的类型通过桥转换将int转换为BOOL 那我该怎么做呢?我知道我可以迭代数

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

BOOL shouldHideViews = YES;
[allViews makeObjectPerformSelector:@selector(setHidden:) withObject:(void *)shouldHideViews]
当我将代码转换为ARC时,它告诉我需要一些桥接转换,然后我更改了:

(void *)shouldHideViews

它说不兼容的类型通过桥转换将int转换为BOOL

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


谢谢

不能将基元类型作为空指针传递。您应该将布尔变量保持为实例变量,并在setHidden中引用它。这样你就可以做到:

shouldHideViews = YES; //declare BOOL shouldHideViews; in your .h file
[allViews makeObjectPerformSelector:@selector(setHidden) withObject:nil];

不能将基元类型作为空指针传递。您应该将布尔变量保持为实例变量,并在setHidden中引用它。这样你就可以做到:

shouldHideViews = YES; //declare BOOL shouldHideViews; in your .h file
[allViews makeObjectPerformSelector:@selector(setHidden) withObject:nil];

这些对你很有帮助


您应该使用
NSNumber
或使用
NSInvocation
制作包装

这些会对你很有帮助


您应该使用
NSNumber
或使用
NSInvocation
制作包装

makeObjectsPerformSelector:withObject:的
object
参数的类型为
id
。这意味着它需要指向Objective-C对象。将非对象强制转换为
id
是一个坏主意,因为系统(特别是在ARC下)可以执行诸如将
retain
release
消息发送到
id
,如果将
YES
强制转换为
id
,系统将崩溃

我建议只使用快速枚举:

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

makeObjectsPerformSelector:withObject:
object
参数的类型为
id
。这意味着它需要指向Objective-C对象。将非对象强制转换为
id
是一个坏主意,因为系统(特别是在ARC下)可以执行诸如将
retain
release
消息发送到
id
,如果将
YES
强制转换为
id
,系统将崩溃

我建议只使用快速枚举:

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

其他表明您不能通过此方式的答案是正确的。但是,有更简单的解决方案:

[allViews setValue:[NSNumber numberWithBool: shouldHideViews] forKey:@"hidden"];
这是因为NSArray会覆盖它的
setValue:forKey:
,以实现此用途

现在还可以使用块:

[allViews enumerateObjectsUsingBlock:
  ^(id obj, NSUInteger idx, BOOL *stop){ [obj setHidden:shouldHideViews];}];
或者是久经考验的
for()
循环(参见@rob mayoff的答案)


其中,我通常只使用
来进行
循环。

其他表示无法通过
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的答案)


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

完成使用arc进行自动参考计数问题。这里的解释:这是ARC之前的一段工作代码吗?@dasblinkenlight,是的,它神奇地工作了。我上星期刚碰到另一个人在做这件事。我相信它会变成指向0x1的指针,它只是作为一个“足够真实”的方式在系统中运行。完成了使用arc自动参考计数问题。这里的解释:这是ARC之前的一段工作代码吗?@dasblinkenlight,是的,它神奇地工作了。我上星期刚碰到另一个人在做这件事。我相信它会变成一个指向0x1的指针,它只是作为一个“足够真实”在系统中运行。我知道你在说什么,但是setHidden:是UIView中的一个方法,我有一个视图数组,所以它不是我可以控制的东西,除非我对视图进行子类化。子类NSArray!您可以在子类NSArray中创建一个方法,将setHidden:发送到数组中的所有UIView。确保在循环遍历数组中的所有对象时,在发送setHidden:之前检查它是否为UIView,否则您的应用程序将崩溃。我知道您在说什么,但setHidden:是UIView中的一个方法,我有一个视图数组,因此除非我对视图进行子类化,否则我无法控制它。子类NSArray!您可以在子类NSArray中创建一个方法,将setHidden:发送到数组中的所有UIView。确保在循环遍历数组中的所有对象时,在发送setHidden:之前检查它是否为UIView,否则你的应用程序将崩溃。是的,我个人也喜欢快速枚举,但出于任何原因,OP不喜欢该答案。是的,我个人也喜欢快速枚举,但无论出于什么原因,OP都不喜欢这个答案。